退出 zsh,但让正在运行的作业保持打开状态?
Posted
技术标签:
【中文标题】退出 zsh,但让正在运行的作业保持打开状态?【英文标题】:Exit zsh, but leave running jobs open? 【发布时间】:2013-10-18 15:14:24 【问题描述】:刚从 bash 切换到 zsh。
在 bash 中,后台任务会在 shell 退出时继续运行。例如这里,dolphin
在exit
之后继续运行:
$ 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
虽然 &
在 bash
中为我工作,但我发现在运行命令(例如调用 java 运行命令的脚本)上仅使用 nohup
、&
或 disown
时,进程退出 shell 时仍会停止。
nohup
使命令忽略来自 shell 的 NOHUP
和 SIGHUP
信号
&
使进程在子终端的后台运行
disown
后跟一个参数(作业列表中作业编号的索引)可防止 shell 向子进程发送 SIGHUP
信号。使用不带参数的 disown
会使其默认为最近的作业。
我在this page 找到了nohup
和disown
信息,在this SO answer 找到了&
信息。
【讨论】:
【参考方案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,但让正在运行的作业保持打开状态?的主要内容,如果未能解决你的问题,请参考以下文章