断开连接后如何恢复外壳


36

我正在远程CentOS 5.6机器上做一些工作,而我的网络却不断下降。重新连接后,是否可以恢复挂起的会话?

编辑:正在使用yum进行一些更新和安装,并且担心如果进程在进行中的过程中不断挂起,则可能会出现问题。


6
tmux或屏幕。
sehe 2011年

Answers:


63

没有办法,但是为了防止这种情况,我喜欢使用tmux。我启动tmux,开始操作,然后继续前进。如果返回并发现连接已断开,那么我要做的就是重新连接并输入tmux attach

这是一个例子。

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion

没有tmux,并且不允许安装我的待办事项清单上没有的东西...

5
@sergio我的心流血:-))使用screen

4
@sergio在Unix系统上,几乎不需要root权限即可运行的任何应用程序都可以安装在其主目录中。
Kusalananda

35

对于tmux和screen的建议都是很好的建议。它们暗示了您问题的答案,但并未实际说明。这个问题的答案是:没有办法。如果您通过ssh登录,则在连接断开时外壳将终止。解决方法是登录并立即启动某种虚拟终端(例如tmux)。当连接断开时,您所在的外壳将结束,但是您可以打开新的外壳并重新连接到虚拟终端(正在运行您实际在其中工作的外壳)。


好。现在清楚了。

假设yum进程仍在运行(当shell收到SIGHUP时并没有立即终止),reptyr或类似的命令可能足以恢复该进程或(如果失败)获取任何将来的输出。不过,外壳通常会在断开连接时终止。
Eroen

@Eroen您的意思是,即使使用tmux,操作系统一旦发现连接丢失,也会终止tmux进程?
2015年

@Dojo连接终止时,tmux实例将停止,但tmux会话(及其管理的shell)将保持正常运行。
William Pursell

如果用户由于例如突然不小心拔下RJ-45电缆而失去了与远程ssh服务器的连接,我认为ssh服务器仍会保持此会话,直到预定义的超时(例如120秒)为止。因此,在这种情况下,是否有一种方法可以在拔下电缆后的120秒内恢复仍在ssh服务器端仍然有效的会话?
加布是好人2016年

8

正如威廉所说,简短的答案是没有,没有办法。为了防止这种情况,您可以在失去连接之前使用screen命令


据我了解,我必须用屏幕启动百胜...嗯,我没有。我无法重新运行yum,它说它仍在使用,我不想强​​行杀死它。..我如何重新获得对运行中的百胜的控制?

and byobu是屏幕的不错补充,可以在一个漂亮的图形终端launchpad.net/byobu中

据我所知,除非有某种隐藏的方法可以将yum命令的输出重定向到当前的学期会话,但我想不到。
尼古拉斯·史密斯,

使用调试器&c有许多解决方案。给一个进程一个新的父shell。Reptyr是其中之一,并且博客文章中描述了该问题,解决方法和其他一些实现。
Eroen

3

不,断开连接后无法恢复外壳。相反,您可以做的是确保断开连接后正在运行的命令继续运行。

为此,请使用“ nohup”和“ disown”命令,它们通常是大多数Shell上的内置命令,即您无需安装任何程序。但是,这仅适用于非交互式命令。

因此,步骤如下:

  1. 登录服务器
  2. 运行命令:“ nohup sudo yum update&”(这还将所有输出记录到当前目录中的nohup.out文件中)
  3. 运行“ disown%1”
  4. 请随时断开连接,或等待断开连接:)

当您回到服务器时,只需“ tail nohup.out”即可查看该命令的运行情况。


一般情况下,这样的工作效果不是很好吗?例如,对于需要一次或多次输入的命令...对于完全非交互式的命令,它可能工作得很好,并且避免了(可能需要安装)终端多路复用器的开销。
CVn 2013年

是的,这仅在您的命令不需要任何用户输入的情况下才有效,我已经更新了答案。总的来说,终端多路复用器是必经之路,但是有人提到不允许安装其他工具。
zygis 2013年

绝对是一个有效的答案,只是在可能的用例中有所限制。通过编辑投票。
CVn

3

有人在评论中添加了reptyr而不是答案,所以我不能对其进行投票,但这似乎是对已编辑问题的一个很好的答案,并且在CentOS上运行良好。

参见:https : //github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

重新连接后,是否可以恢复挂起的会话?

编辑:正在使用yum进行一些更新和安装,并且担心如果进程在进行中的过程中不断挂起,则可能会出现问题。

同样,我失去了与yum更新会话的远程连接。所以我搜索并找到了这个问题...然后这次重新连接并使用了屏幕:

  1. 重新连接SSH
  2. 屏幕
  3. 按照上面的链接安装reptyr
  4. ps -a | grep yum
  5. 复方psid

而且在恢复的提示下,我在几个小时前就给了百胜。

从技术上讲,答案都是正确的,这不是恢复已挂起的会话,而是将孤立进程重新绑定到当前会话。也是非常有用的...


1

正如许多人所建议的screentmux,它们都支持基本功能,但是具有独特的特定功能,因此不能说一个在所有情况下都优于另一个。例如,只有tmux支持Window-splitting,而只有GNU屏幕可以使用(Ctrl + ar)切换长行换行在这里查看更详细的比较。

还存在专门解决ssh问题的工具:

Autossh是一个程序,用于启动ssh的副本并对其进行监视,并在死或停止传输流量时根据需要重新启动它。这个想法来自rstunnel。

Mosh是一个远程终端应用程序,它允许漫游,支持间歇性连接并提供智能的本地回显和用户按键的线路编辑。Mosh替代了SSH。它更加健壮和响应迅速,尤其是在Wi-Fi,蜂窝和长途链路上。


-1

可以使用tmuxshell 来完成。如果断开连接,重新连接会话的最快方法是:

tmux a #0

这没有添加任何已接受的答案未说的内容。它还假定用户已经在tmux运行会话。
库萨兰达

2
这可能是对该答案的评论,说“您可以缩写attacha”。
杰夫·谢勒
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.