刚刚从bash切换到zsh。
在bash中,后台任务在shell退出时继续运行。例如,此处dolphin
继续在exit
:
$ dolphin .
^Z
[1]+ Stopped dolphin .
$ bg
[1]+ dolphin . &
$ exit
这就是我想要的默认行为。
相反,zsh的行为是警告在exit
上运行作业,然后再次exit
关闭它们。例如,dolphin
在第二个exit
- 命令实际退出shell时关闭:
% dolphin .
^Z
zsh: suspended dolphin .
% bg
[1] + continued dolphin .
% exit
zsh: you have running jobs.
% exit
如何像bash一样制作zsh的默认行为?
答案 0 :(得分:102)
使用dolphin &!
:
&!
[self.reportWebView.layer UIGraphicsGetCurrentContext()];
(or equivalently, &|
)是后台 和 disown 的特定于zsh的快捷方式,退出shell将使其运行。
答案 1 :(得分:53)
<强>
HUP
强>...在zsh中,如果你在shell退出时运行后台作业,那么shell会认为你想要杀死它;在这种情况下,它会发送一个名为
SIGHUP
的特定信号...如果你经常启动即使shell退出也要继续的工作,那么你可以设置选项NO_HUP
,后台工作将会不管怎样。
所以只需设置NO_HUP
选项:
% setopt NO_HUP
答案 2 :(得分:23)
我发现使用nohup
,&
和disown
的组合对我有效,因为我不希望在shell退出时永久地导致作业运行
nohup <command> & disown
虽然&
只有bash
对我有用,但我发现在运行命令时只使用nohup
,&
或disown
,例如调用java run命令的脚本,退出shell时进程仍会停止。
nohup
使命令忽略来自shell的NOHUP
和SIGHUP
信号&
使进程在后面的子终端disown
后跟一个参数(作业列表中的作业编号索引)会阻止shell向子进程发送SIGHUP
信号。在没有参数的情况下使用disown
会导致它默认为最近的作业。我在this page找到了nohup
和disown
信息,在this SO answer找到了&
信息。
答案 3 :(得分:1)
我通常使用screen
来保持后台作业的运行。
1)创建一个屏幕会话:
screen -S myScreenName
2)启动脚本,服务,后台程序或其他
3)使用
退出(分离)屏幕会话screen -d
或
快捷方式ALT+A then d
几百年后 - 如果你想恢复你的课程(重新安排):
screen -r myScreenName
如果您想知道屏幕会话,其名称及其状态(附加或分离)是否存在:
screen -ls
此解决方案适用于所有终端解释器,如bash,zsh等。
另请参阅man screen