我正在使用 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
将死亡。
为了避免下一次,如果使用tcsh
,zsh
或者bash
,关闭机器前,按下Ctrl-Z暂停mv
,进入bg
恢复它的背景,并disown
以否认它。
或者你可以使用screen
或tmux
。在 SIGHUP 后,这些将与现在消失的主机终端分离,但在它模拟的终端中运行的应用程序将继续无头运行,您可以稍后将会话重新连接到另一个终端以查看mv
进展情况。
或者用于nohup mv
使mv
SIGHUP 免疫并将其输出和错误转到nohup.out
您可以稍后检查的文件中。
现在,我不知道您的特定托管服务提供商,但是对于某些托管服务提供商,当您ssh
进入实例时,您不是在那里启动 shell 会话,而是附加到控制台,即连接到已经启动的会话,当您退出时,您不会终止该会话,只需与其分离即可。因此,shell 不会被杀死,mv
. 如果是这种情况,您会注意到ps
从那里运行将pid
在两个单独的ssh
会话中为您的 shell 提供相同的结果。