如果我们先执行ssh然后断开连接,那么继续操作会怎样?


10

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

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

mv命令会怎样?

注意:重新登录后,我发现所有文件都已正确移动,即使我确定关闭连接后该文件也没有移动。看来mv确实继续运行。

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


我想,它将引发关于源/目标不可用的错误
SHW 2013年

1
如果目录位于同一分区上,则将目录移动到另一个目录是“瞬时的”。而且即使您逐个文件移动文件,也可以很快。您确定断开连接它还会继续吗(而不是在将不同的SIGHUP信号发送到子进程时完成,这可能会花费一些[在计算机规模上]。)
Olivier Dulac 2013年

作为解决方法,请使用screentmux登录一次以启动虚拟终端,该虚拟终端在断开连接后仍将继续运行[即,您以后可以重新连接到它,并查看与您离开终端时处于相同状态的终端,以及其中的所有更新。之间]
奥利维尔·杜拉克

Answers:


19

如果mv开始为:

ssh host mv x y

然后mv,如果尝试向stdout或stderr写入任何内容(如错误消息),则将收到SIGPIPE(并消亡)。

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

ssh host

并从mv那里的交互式外壳启动,当启动的伪终端的主端sshd将被关闭(ssh退出时关闭TCP连接)时,与伪终端的从属端相关联的会话的负责人是远程交互式外壳,将收到SIGHUP信号(挂断)。

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

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

如果您发出了:

trap '' HUP

然后,所有在它之后开始的作业都将继承它,并且将忽略SIGHUP。

该外壳程序不会因断开连接后发送的SIGHUP信号而死亡,但由于其标准输入已消失,因此它将在下一个提示时退出。退出时,一些shell将SIGHUP发送到其(非私有)作业。那些开始之后trap '' HUP会忽略它,其他人将会死亡。

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

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

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

或使用nohup mv使mv免疫SIGHUP和其输出和错误去nohup.out,你可以稍后检查文件。

现在,我不知道您的特定托管服务提供商,但是有些人,当您ssh进入实例时,您不是在那儿启动Shell会话,而是连接到控制台,即已启动的会话,当您退出时,您不会终止该会话,而只是断开它。因此,外壳不会被杀死,也不会被杀死mv。如果是这种情况,您会注意到,ps从那里运行可以pid在两个单独的ssh会话中为您的shell提供相同的效果。


所以您说的是mv将终止。好吧,请检查笔记。
user4951 2013年

2
+1。出色的答案(因为它深入到细节中以解释发生的情况和时间)。
Olivier Dulac 2013年

我根据你的回答了一篇文章。希望有人会发现它会有所帮助。
x-yuri
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.