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


208

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

Answers:


205

使用nohup让您的过程中忽略挂起信号:

$ nohup long-running-process &
$ exit

20
就是这个。无需安装屏幕或tmux。实际上,这是个好方法。当然'screen'或'tmux'都是出色的应用程序,应在需要时使用,但只要在后台运行一个可以注销的进程即可,执行上述操作即可。
reiche

2
Nohup像是被拒绝吗?
cjac

28
它们具有相似的目的,但是在许多方面存在差异。nohup拦截SIGHUP,以便当运行它的外壳退出并将SIGHUP发送给所有仍在运行的子代时,long-running-process它不会死亡。disown只需从Bash的子列表中删除指定的作业,就不会尝试发送SIGHUP。nohup是一个与Shell分开的程序,因此它适用于所有Shell,而disownBash内置。nohup接受要运行的命令,而disown仅在作业启动并且已将其后台化后才能运行,这样您就可以返回Shell。
沃伦·杨

3
真棒快速审查那些谁不熟悉的nohup和断绝关系-以及一些简单的方法来处理终端会话 serverwatch.com/tutorials/article.php/3935306/...

7
tail -f nohup.out检查回来时发生了什么事。
里卡多·斯图文

141

您要使用GNU屏幕。超级棒!

ssh me@myserver.com
screen               #start a screen session
run-a-long-process

CTRL+ ad从您的屏幕会话中分离

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

回到笔记本电脑时:

ssh me@myserver.com
screen -r            #resume the screen session

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

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

  • CTRL+ ac创建一个新窗口
  • CTRL+ an切换到屏幕会话中的下一个窗口
  • CTRL+ ap切换到屏幕会话中的上一个窗口
  • 如果您从许多不同的系统登录,则可能不小心使自己陷入了另一台计算机上的活动屏幕会话中。出于这个原因,我始终会继续进行操作,screen -d -r以确保如果将另一个外壳程序附加到我的屏幕会话中,那么在我将其恢复到当前系统上之前,它将被分离。

8
tmux是屏幕的现代类似物。
zvolkov

我不了解现代语言,但是如果您习惯于bash / emacs键,tmux的默认键前缀(Ctrl + b)会有所帮助。
2010年

2
如果您出于某种原因想要共享终端,则屏幕非常酷。创建一个屏幕,screen -S name然后让您的其他朋友连接到它screen -x name
帕特里克

1
tmuxtmuxinator完美结合,适合花哨的设置,而我更喜欢将其screen作为一种快速简单的解决方案。
EarthmeLon 2014年

这个答案是最好的。。我喜欢。出色的研究
Jaffer Wilson

42

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

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

    [1]+  Stopped                 processName
    
  2. 发送processName至后台bg %1(使用紧随其后的工作#%)。这将processName在后台继续。

  3. processNamedisown %1分开使用disown PID-h如果要保持所有权直到终止当前的shell,请使用该标志。


5
谢谢你!我有一份工作正在运行,并认为我将无法继续下去,因为我在&开始工作时就没有使用过。这看起来很棒!
马特

4
这真太了不起了!我从不知道Linux可以让您像这样转移活动进程的控制权。我担心在长时间运行的过程中,SSH进入服务器时会耗尽电池电量,这就是我的答案!
冥王星

14

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

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

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

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

最后是byobu的一些屏幕截图


我在Byobu Terminal内的服务器上启动了一个进程,但并不真正知道它是什么(我只是搜索Terminal并单击Byobu,因为之前从未见过)。我一直使用Byobu,因为它的底部有一个彩色的状态栏,我认为它很酷。今天,我发现自己想通过SSH远程访问该终端会话。我所要做的就是键入“ byobu”,它立即显示了终端会话。真的很开心,我偶然发现了byobu!
尼克

8

可能值得注意的是

ssh -t lala screen -rxU moo将附加到主持人lalamoo会话上

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

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


3

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


3

您可以在此处找到一个很好的指南: 断开连接时保持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紧接着连续


您可以<kbd>Ctrl</kbd>用来将名称显示为键盘按键。
Tomasz

1

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

我将Windows XP笔记本电脑(我需要某些特定于Windows的硬件所需的笔记本电脑)用作使用NX Nomachine的两台Linux服务器的前端。我什至可以从Linux打印到Windows笔记本电脑附带的打印机上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.