退出 zsh,但让正在运行的作业保持打开状态?

Posted

技术标签:

【中文标题】退出 zsh,但让正在运行的作业保持打开状态?【英文标题】:Exit zsh, but leave running jobs open? 【发布时间】:2013-10-18 15:14:24 【问题描述】:

刚从 bash 切换到 zsh。

在 bash 中,后台任务会在 shell 退出时继续运行。例如这里,dolphinexit 之后继续运行:

$ dolphin .
^Z
[1]+  Stopped                 dolphin .
$ bg
[1]+ dolphin . &
$ exit

这是我想要的默认行为。

相比之下,zsh 的行为是警告 exit 上正在运行的作业,然后在再次 exit 时关闭它们。例如这里,dolphin 在第二个 exit-command 实际退出 shell 时关闭:

 % dolphin .
^Z
zsh: suspended  dolphin .
 % bg
[1]  + continued  dolphin .
 % exit
zsh: you have running jobs.
 % exit 

如何使 zsh 的默认行为像 bash 一样?

【问题讨论】:

【参考方案1】:

&!启动程序:

dolphin &!

&! (or equivalently, &|) 是一个 zsh 特定的快捷方式,通向 background disown 进程,这样退出shell 会让它继续运行。

【讨论】:

为了完整起见,您能否还列出一旦启动后如何拒绝它? @trusktr There's a different question about disowning the foreground process。为了清楚起见,我认为最好将其分开。对于任何对 zsh 感兴趣的人,我已经问过a question on U&L SE about how to create a faster workflow for disowning the foreground process。 我喜欢这个解决方案,我会为单个命令实现它,但我仍在寻找一种方法来改变 Zsh 的默认行为。 @Vince 您的意思是将默认设置更改为始终拒绝后台进程吗?如果是这样,您可以在您的~/.zshrc 中使用setopt nohup。然后启动以& 为背景的命令也将始终不承认它。虽然默认情况下 zsh 仍然会在您尝试退出时提醒您有正在运行的作业。您也可以使用 setopt nocheckjobs 将其关闭。 @DimiDak 也适合我。 alias z="sudo sleep 1 &|"。像这样构建最小的例子,你最终会缩小范围。【参考方案2】:

来自zsh documentation:

HUP

... 在 zsh 中,如果您在 shell 退出时有一个后台作业正在运行,那么 shell 将假定您希望它被杀死;在这种情况下,它会发送一个名为SIGHUP 的特定信号...如果您经常启动即使在shell 退出时也应该继续的作业,那么您可以设置选项NO_HUP,后台作业将被单独保留。

所以只需设置NO_HUP 选项:

% setopt NO_HUP

【讨论】:

如果你不想要警告,是的。【参考方案3】:

我发现使用 nohup&disown 的组合对我有用,因为我不想在 shell 退出时永久导致作业运行。

nohup <command> & disown

虽然 &amp;bash 中为我工作,但我发现在运行命令(例如调用 java 运行命令的脚本)上仅使用 nohup&amp;disown 时,进程退出 shell 时仍会停止。

nohup 使命令忽略来自 shell 的 NOHUPSIGHUP 信号 &amp; 使进程在子终端的后台运行 disown 后跟一个参数(作业列表中作业编号的索引)可防止 shell 向子进程发送 SIGHUP 信号。使用不带参数的 disown 会使其默认为最近的作业。

我在this page 找到了nohupdisown 信息,在this SO answer 找到了&amp; 信息。

【讨论】:

【参考方案4】:

我通常使用screen 来保持后台作业的运行。

1) 创建屏幕会话:

screen -S myScreenName

2) 启动您的脚本、服务、守护程序或其他任何东西

3) 退出(分离)屏幕会话

screen -d

或 快捷方式ALT+A then d


几百年后 - 如果您想恢复会话(重新连接):

screen -r myScreenName

如果您想知道是否有屏幕会话、其名称和状态(附加或分离):

screen -ls

此解决方案适用于所有终端解释器,如 bash、zsh 等。 另见man screen

【讨论】:

给 MacOS 用户的注意事项,从屏幕分离的键盘快捷键是 Control+A,然后是 D。这也是我让进程运行并屈服于标准输出时的唯一选择,写 screen -d没有帮助。 很好,但与 Q 无关,Q 专门关于如何在退出 ZSH 时保持 bg 任务运行。 @RichieHH 我不相信你是正确的。您可以生成“后台任务”并允许它们在退出 ZSH 时运行:screen -d -m your command 将为your command 生成一个屏幕会话,随后的exit 将退出 shell。 需要更多支持

以上是关于退出 zsh,但让正在运行的作业保持打开状态?的主要内容,如果未能解决你的问题,请参考以下文章

[转载][整理]解决SSH退出登陆后保持进程继续在后台运行

如果任何作业在 python 中失败,如何退出进程?

单击退出后应用程序保持打开状态?怎么了?

您应该让 Redis 保持打开状态,还是在每次在节点中使用后打开并退出它?

程序退出状态码

Spark 退出状态 134. 啥意思