退出zsh,但是打开正在运行的作业?

时间:2013-10-10 17:59:54

标签: bash zsh jobs

刚刚从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的默认行为?

4 个答案:

答案 0 :(得分:102)

使用dolphin &!

启动该计划
&!

[self.reportWebView.layer UIGraphicsGetCurrentContext()]; or equivalently, &|)是后台 disown 的特定于zsh的快捷方式,退出shell将使其运行。

答案 1 :(得分:53)

来自zsh documentation

  

<强> 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的NOHUPSIGHUP信号
  • &使进程在后面的子终端
  • 中运行
  • disown后跟一个参数(作业列表中的作业编号索引)会阻止shell向子进程发送SIGHUP信号。在没有参数的情况下使用disown会导致它默认为最近的作业。

我在this page找到了nohupdisown信息,在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