我正在使用mv命令将一个目录移动到另一个目录。
但是,我被迫关闭计算机,这意味着失去与服务器的连接。
mv命令会怎样?
注意:重新登录后,我发现所有文件都已正确移动,即使我确定关闭连接后该文件也没有移动。看来mv确实继续运行。
这是我ssh到steadfast.net云服务器中的centosh机器。
screen
或tmux
登录一次以启动虚拟终端,该虚拟终端在断开连接后仍将继续运行[即,您以后可以重新连接到它,并查看与您离开终端时处于相同状态的终端,以及其中的所有更新。之间]
我正在使用mv命令将一个目录移动到另一个目录。
但是,我被迫关闭计算机,这意味着失去与服务器的连接。
mv命令会怎样?
注意:重新登录后,我发现所有文件都已正确移动,即使我确定关闭连接后该文件也没有移动。看来mv确实继续运行。
这是我ssh到steadfast.net云服务器中的centosh机器。
screen
或tmux
登录一次以启动虚拟终端,该虚拟终端在断开连接后仍将继续运行[即,您以后可以重新连接到它,并查看与您离开终端时处于相同状态的终端,以及其中的所有更新。之间]
Answers:
如果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
将会丧命。
为了避免下一次,如果使用tcsh
,zsh
或者bash
,关闭机器前,按下Ctrl-Z暂停mv
,进入bg
恢复它的背景,并disown
以否认它。
或者您可以使用screen
或tmux
。在SIGHUP上,这些将刚刚从它们现在消失的主机终端上分离,但是在其模拟的终端上运行的应用程序将继续无头运行,您可以稍后将会话重新连接到另一个终端以查看mv
进展如何。
或使用nohup mv
使mv
免疫SIGHUP和其输出和错误去nohup.out
,你可以稍后检查文件。
现在,我不知道您的特定托管服务提供商,但是有些人,当您ssh
进入实例时,您不是在那儿启动Shell会话,而是连接到控制台,即已启动的会话,当您退出时,您不会终止该会话,而只是断开它。因此,外壳不会被杀死,也不会被杀死mv
。如果是这种情况,您会注意到,ps
从那里运行可以pid
在两个单独的ssh
会话中为您的shell提供相同的效果。