it-swarm.cn

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

有时我有长时间运行的进程,要在回家之前启动,因此我创建了到服务器的SSH会话以启动该进程,但是随后我想关闭笔记本电脑并回家,然后晚饭后,我想下班前检查一下我开始的过程。如何使用SSH做到这一点?我的理解是,如果断开SSH连接,也会断开服务器上的登录会话,因此会导致长时间运行的进程中断。

216
λ Jonas Gorauskas

使用Nohup使您的进程忽略挂断信号:

$ Nohup long-running-process &
$ exit
217
Warren Young

您想使用GNU屏幕。这真棒!

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

CTRL+a , d 从屏幕会话中分离

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连接到我的屏幕会话,则在我在当前系统上恢复它之前,它将被分离。
143
Sandy

如果您尚未计划并设置screen等,请执行以下操作:

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

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

  3. 不显示processNamedisown %1disown PID。如果要保持所有权直到终止当前的命令行管理程序,请使用-h标志。

42
Mike Covington

您要使用的屏幕是屏幕,或者甚至更好的是称为byobu的屏幕周围的用户友好包装器。

屏幕允许您在同一ssh会话中运行多个虚拟终端会话。 教程帮助页面 可用。

byob 是一个包装器,它允许使用简单的功能键而不是ctrl-a的组合键轻松地打开新屏幕。它还显示一条状态行,其中包含所有可以打开的虚拟终端。

另一个不错的功能是,当ssh连接断开时,您的所有屏幕都可以停滞不动。您只需通过ssh再次连接并致电byobu,一切便像以前一样。

最后,byobu的一些 屏幕截图

15
txwikinger

可能值得注意的是

ssh -t lala screen -rxU moo将附加到主机上的moo会话lala

ssh -t lala screen -S moo将在主机上创建moo会话lala

ssh -t lala screen -S moo quux将在主机上创建moo会话lala并运行程序quux,并在完成时退出会话。

9
cjac

您可以在此处找到一个很好的指南:断开连接时保持SSH会话运行

Sudo apt-get install screen

现在,您只需在命令行中输入screen即可开始新的屏幕会话。系统会显示一些有关屏幕的信息。按Enter键,您将进入正常提示状态。

断开连接(但保持会话运行) Ctrl + A 然后 Ctrl + D 立即接连。您将看到消息[分离]

重新连接到已运行的会话

screen -r

重新连接到现有会话,或者如果不存在则创建一个新会话

screen -D -r

在正在运行的屏幕会话中创建新窗口 Ctrl + A 然后 C 立即接连。您将看到一个新的提示。

从一个屏幕窗口切换到另一个 Ctrl + A 然后 Ctrl + A 立即接连。

要列出打开的窗口 Ctrl + A 然后 W 立即接连

4
Victor Hugo Arango A.

老问题,奇怪的是仍然没有人建议 tmux ,它充当n个控制台的包装,并保持打开状态直到需要。除了tmux具有许多功能之外,这还可以进行更多控制。它很容易管理,您只需执行tmux,这将带您进入Shell,开始轻松的工作,然后按ctrl + b,然后按d(分离)(ctrl+b是tmux的“确定谷歌”,并且d是关闭而不退出Shell的命令)。如果仅关闭,例如PuTTY,这实际上是可行的。晚餐后,当您再次连接时,可以使用tmux attach重新打开tmux,以完全离开屏幕的状态查看屏幕。我爱的东西是拆分窗格:ctrl+b,然后按"。要从一个窗格更改为另一窗格,请先按ctrl+b,然后按向上/向下箭头。

4
nnsense

我使用NX NoMachine,它对我来说是免费的,因为只有我一个人。本质上,它在服务器上运行X会话,您可以反复连接和断开该会话。未连接时,X会话将继续运行。可以从任何地方进行连接。您可以在浮动窗口或包含整个桌面(例如,完整的Gnome桌面)的单个窗口之间选择。客户端(可以在笔记本电脑上运行)可以在Linux,MacOS,Solaris或Microsoft Windows上运行。在后一种情况下,如果选择浮动窗口,它们将分别出现在Windows任务栏上。

我将Windows XP笔记本电脑(我需要某些Windows专用硬件,我需要它))用作使用NX Nomachine的两台Linux服务器的前端。我什至可以打印到连接到的打印机我的Windows笔记本电脑来自Linux。

2
Rob_before_edits

Tmux是在后台运行长时间运行的进程的不错选择。

我必须继续在Google云平台的VM实例/服务器(使用OS:Ubuntu 16.0)上)上运行长时间的进程。我必须在其中启动SSH终端,并从该终端启动保持终端连接以运行该进程。到目前为止,一切都很好,但是请等待,如果与我的SSH终端的连接被终止,则长时间运行的进程会立即停止,因此我必须再次重新运行它们ssh终端重新启动或从新的ssh终端启动。

我发现tmux是避免终止即使在终端关闭后也要运行的进程的好方法。

终端多路复用器tmux)开始tmux会话:

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

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

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

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

要终止tmux会话:

  1. 停止该过程。然后在tmux-terminal-window中输入exit

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

有关更多详细信息,请参阅以下文章:

  1. https://www.tecmint.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/
1
Yogesh