如果我们执行 ssh 然后断开连接,继续操作会发生什么?

use*_*951 10 ssh

我正在使用 mv 命令将一个目录移动到另一个目录。

但是,我被迫关闭了我的计算机,这意味着失去了与服务器的连接。

mv 命令会发生什么?

注意:重新登录后,我看到所有文件都已正确移动,即使我确定关闭连接时它没有移动。似乎 mv 确实继续运行。

这是我在steadfast.net 云服务器中ssh 到centosh 机器。

Sté*_*las 19

如果mv开始为:

ssh host mv x y
Run Code Online (Sandbox Code Playgroud)

然后mv如果它试图写入任何stdout或stderr(如错误消息)将收到一个SIGPIPE(和模头)。

如果您启动了一个交互式会话,例如:

ssh host
Run Code Online (Sandbox Code Playgroud)

并从mv那里的交互式 shell启动,当被启动的伪终端的主端sshd将被关闭(ssh退出时关闭 TCP 连接时),会话的领导者与伪终端的从端关联,即是远程交互shell,会收到SIGHUP信号(挂断)。

收到该信号后,shell(除非您已发出 a trap '' HUP)通常将该信号转发给它们已启动的作业中的所有进程,除非您明确告诉它不要(例如在某些 shell 中使用disown或使用&|)。

其他进程(如mv)通常会在接收到该信号时死亡,除非他们被告知忽略它(通过使用nohup或者如果他们的父进程忽略它)。

如果您已发出:

trap '' HUP
Run Code Online (Sandbox Code Playgroud)

然后所有在它之后启动的作业将继承它并忽略 SIGHUP。

shell 不会因为断开连接时发送的 SIGHUP 信号而死亡,而是会在下一个提示下退出,因为它的 stdin 已经消失了。退出时,一些 shell 将 SIGHUP 发送到他们的(非否认的)作业。那些开始后trap '' HUP会忽略它,其他人会死。

简而言之,在这种情况下,除非您事先采取预防措施以免发生这种情况,否则您mv将死亡。

为了避免下一次,如果使用tcshzsh或者bash,关闭机器前,按下Ctrl-Z暂停mv,进入bg恢复它的背景,并disown否认它。

或者你可以使用screentmux。在 SIGHUP 后,这些将与现在消失的主机终端分离,但在它模拟的终端中运行的应用程序将继续无头运行,您可以稍后将会话重新连接到另一个终端以查看mv进展情况。

或者用于nohup mv使mvSIGHUP 免疫并将其输出和错误转到nohup.out您可以稍后检查的文件中。

现在,我不知道您的特定托管服务提供商,但是对于某些托管服务提供商,当您ssh进入实例时,您不是在那里启动 shell 会话,而是附加到控制台,即连接到已经启动的会话,当您退出时,您不会终止该会话,只需与其分离即可。因此,shell 不会被杀死,mv. 如果是这种情况,您会注意到ps从那里运行将pid在两个单独的ssh会话中为您的 shell 提供相同的结果。

  • +1。出色的答案(因为它很好地解释了会发生什么以及何时发生)。 (2认同)