SSH 会话断开后保持进程运行

SSH 会话断开后保持进程运行

有时,我想在回家之前启动长时间运行的进程,因此我会创建一个到服务器的 SSH 会话来启动该进程,但随后我想关闭笔记本电脑并回家。

后来,晚饭后,我想检查一下下班前开始的流程。我怎样才能用 SSH 做到这一点?

我的理解是,如果您中断 SSH 连接,您也会中断服务器上的登录会话,从而终止长时间运行的进程。

答案1

使用nohup让你的进程忽略挂起信号:

$ nohup long-running-process &
$ exit

要监视进度,请检查 nohup 的输出:

$ tail -f nohup.out

答案2

您想使用 GNU Screen。真是超级棒啊!

ssh [email protected]
screen               #start a screen session
run-a-long-process

CTRL+ ad从屏幕会话中分离

exit                 #disconnect from the server, while run-a-long-process continues

当您回到笔记本电脑时:

ssh [email protected]
screen -r            #resume the screen session

然后检查长时间运行的进程的进度!

screen是一个非常全面的工具,可以做的事情比我所描述的要多得多。在屏幕会话中,尝试 ctrl+a,?学习一些常用命令。最常见的可能是:

  • CTRL+ a,c创建一个新窗口
  • CTRL+ a,n切换到屏幕会话中的下一个窗口
  • CTRL+ a,p切换到屏幕会话中的上一个窗口
  • 如果您从多个不同的系统登录,您可能会不小心将自己连接到另一台计算机上的活动屏幕会话。出于这个原因,我总是恢复以screen -d -r确保如果另一个 shell 连接到我的屏幕会话,则在我在当前系统上恢复它之前它将被分离。

答案3

如果您还没有提前计划和设置screen等,只需执行以下操作:

  1. 如果您的进程在后台运行:转到#3,否则:Ctrl-Z暂停前台进程。这将报告挂起进程的作业号,例如:

    [1]+  Stopped                 processName
    
  2. 发送processName到后台bg %1(使用 后面的作业 # %)。这将processName在后台恢复。

  3. 否认 processNamedisown %1disown PID-h如果您想在终止当前 shell 之前保留所有权,请使用该标志。

答案4

多路复用器是在后台运行长时间运行的进程的一个不错的选择。

我必须在谷歌云平台的虚拟机实例/服务器(操作系统:Ubuntu 16.0)上继续运行长时间运行的进程。我必须启动 SSH 终端,并且从终端中,我必须保持终端连接才能运行该进程。现在到目前为止,一切都很好。但是,如果与我的 SSH 终端的连接终止,那么长时间运行的进程会立即停止,因此我必须在 ssh 终端重新启动或从新的 ssh 终端重新运行它们。

我发现tmux这是一个很好的解决方案,可以避免我们想要在终端关闭后运行的进程终止。

终端复用器( tmux) 启动tmux会话:

  1. 启动 ssh 终端
  2. 类型tmux。它将在同一终端中打开一个窗口。
  3. 运行命令以在 tmux 会话中启动长时间运行的进程。

现在,即使 SSH 终端突然关闭/终止,tmux 会话也将继续在实例/服务器上运行已启动的 lon 运行进程。

如果连接终止,那么如何重新连接它以查看后台 tmux 会话中运行的进程:

  1. 重新连接或打开新的 ssh 终端。要查看此进程(在后台保持运行),请输入:tmux attachcommand。

想要终止 tmux 会话:

  1. 停止该过程。然后输入exittmux-terminal-window。

(请注意:如果我们使用tmux detach命令:它将从 tmux 会话窗口/终端退出,而不终止/停止 tmux 会话)

更多详情请参考以下文章:

  1. https://www.howtoing.com/keep-remote-ssh-sessions-running-after-disconnection/
  2. https://limitlessdatascience.wordpress.com/2019/08/22/tmux-to-keep-jupyter-notebook-running-in-the-background/

相关内容