Disown 不会采用 -h 选项

Cod*_*rer 6 zsh nohup disown

我正在运行一个命令,现在我意识到我想在关闭 SSH 会话后继续运行。我没有用&参数开始它,但我已经把它放在后台(CTRL- z, bg)。现在我试图让它在我断开连接后继续运行。那disown -h是为了什么,对吧?我已经尝试过disown -h并且disown -h 1(将jobs我的工作显示为 #1),并且我得到了

disown: job not found: -h
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 6

bash,zshksh93是具有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
Run Code Online (Sandbox Code Playgroud)

所以 nohup 关联数组保存了退出时不发送 SIGHUP 的作业列表。所以,而不是disown -h %1,你会写nohup[1]=.

另请参阅setopt nohup退出时不向任何作业发送 SIGHUP。


mrb*_*mrb 5

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
Run Code Online (Sandbox Code Playgroud)

disown -h使用 bash 参数,该参数会导致作业保留在作业表中,并且当 bash 收到 SIGHUP 时不会收到 SIGHUP (根据 bash 的help disown)。此参数不适用于 zsh。