我正在运行一个命令,现在我意识到我想在关闭 SSH 会话后继续运行该命令。我没有以争论开始它&
,但我把它放在了背景中(CTRL- z,bg
)。现在我正在努力让它在断开连接后继续进行。这就是disown -h
目的,对吧?我已经尝试过disown -h
(disown -h 1
将jobs
我的工作显示为#1),然后我得到
disown: job not found: -h
为什么disown
将“-h”作为工作规范而不是参数?我加入了zsh
,如果这很重要的话。
答案1
bash
、zsh
和ksh93
是具有命令的 shell disown
。在这三者中,bash
是唯一支持h
选项的。如果没有-h
它,则会模拟zsh
行为(从作业表中删除),而使用-h
它则会模拟ksh93
行为(退出时不会向其发送 SIGHUP,但不会将其从作业表中删除,以便您仍然可以bg
或fg
杀死它)。
您可以使用 zsh 模拟该行为,方法是:
typeset -A nohup
trap 'disown %${(k)^nohup}' EXIT
trap 'for i (${(k)nohup}) (($+jobstate[i])) || unset "nohup[$i]"' CHLD
因此 nohup 关联数组保存退出时不会发送 SIGHUP 的作业列表。因此,disown -h %1
您可以写成nohup[1]=
.
另请参阅setopt nohup
退出时不向任何作业发送 SIGHUP。
答案2
disown
其本身足以让程序在断开连接后继续运行:
$ command_running_forever
^Z
zsh: suspended command_running_forever
$ bg
[1] + continued command_running_forever
$ jobs
[1] + running command_running_forever
$ disown %1
$ logout
disown -h
使用 bash 参数,该参数会导致作业保留在作业表中,并且当 bash 收到 SIGHUP 时不会收到 SIGHUP (根据 bash 的help disown
)。此参数不适用于 zsh。