我正在运行一个命令,现在我意识到我想在关闭 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
,如果那重要的话。
bash
,zsh
和ksh93
是具有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。
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。
归档时间: |
|
查看次数: |
4410 次 |
最近记录: |