disown
如果您希望在断开连接后仍保持作业运行,有人会解释是否有必要以及为什么有必要吗?
我问这个问题是因为我访问过的每个网站都说要使用disown
andbg
但bg
它本身对我有用,我不知道为什么。
是因为我还没有完全理解它的disown
用途,还是有一些设置影响了bg
命令的默认行为?
这就是我所做的:
- 通过 SSH 连接到我的 CentOS 6 机器
创建了一个简单的流程:
tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
暂停了工作
- 通过在后台恢复它
bg 1
- 与 SSH 服务器断开连接
然后我通过 FTP 检查该.tar.gz
文件的大小是否仍在增长,事实确实如此。
答案1
通过后台运行的进程bg
通常&
会在以下两种情况下死亡:
- shell 收到 SIGHUP
- 他们尝试写入不再存在的终端。
项目 #1 是关闭终端时的罪魁祸首。然而它是否发生取决于如何你关闭你的终端。您可以通过以下方式关闭它:
- 比如在窗口管理器中单击“X”
- 您可以键入
exit
、logout
或CTRL+ D。
第 #1 项将导致发送 SIGHUP。 #2 没有。
长话短说,如果您使用 后台进程,然后使用、或+bg
注销,该进程将不会被终止。exit
logout
CTRLD
答案2
当您关闭终端时,使用该终端的所有进程(请参阅输出TTY
中的列ps -elf
)都会收到一个SIGHUP
.这取决于进程要做什么SIGHUP
。在经典的 UNIX(AIX、Solaris)中,进程在此信号上关闭。这就是为什么你需要使用disown
.从man bash
:
默认情况下,shell 在收到 SIGHUP 后退出。在退出之前,交互式 shell 会向所有正在运行或已停止的作业重新发送 SIGHUP。停止的作业将被发送 SIGCONT 以确保它们收到 SIGHUP。为了防止 shell 向特定作业发送信号,应该使用 disown 内置命令将其从作业表中删除(请参阅下面的 SHELL BUILTIN 命令),或者使用 disown -h 将其标记为不接收 SIGHUP。