Disown 不会采用 -h 选项

Disown 不会采用 -h 选项

我正在运行一个命令,现在我意识到我想在关闭 SSH 会话后继续运行该命令。我没有以争论开始它&,但我把它放在了背景中(CTRL- zbg)。现在我正在努力让它在断开连接后继续进行。这就是disown -h目的,对吧?我已经尝试过disown -hdisown -h 1jobs我的工作显示为#1),然后我得到

disown: job not found: -h

为什么disown将“-h”作为工作规范而不是参数?我加入了zsh,如果这很重要的话。

答案1

bashzshksh93是具有命令的 shell disown。在这三者中,bash是唯一支持h选项的。如果没有-h它,则会模拟zsh行为(从作业表中删除),而使用-h它则会模拟ksh93行为(退出时不会向其发送 SIGHUP,但不会将其从作业表中删除,以便您仍然可以bgfg杀死它)。

您可以使用 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。

相关内容