122

Just switched from bash to zsh.

In bash, background tasks continue running when the shell exits. For example here, dolphin continues running after the exit:

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

This is what I want as the default behavior.

In contrast, zsh's behavior is to warn about running jobs on exit, then close them if you exit again. For example here, dolphin is closed when the second exit-command actually exits the shell:

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

How do I make zsh's default behavior here like bash's?

4

4 回答 4

212

启动程序&!

dolphin &!

&!(或等效的&|)是 zsh 特定的快捷方式,用于后台 取消 进程,这样退出 shell 将使其继续运行。

于 2015-11-16T12:55:51.637 回答
65

zsh 文档

HUP

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

所以只需设置NO_HUP选项:

% setopt NO_HUP
于 2013-10-10T18:04:28.400 回答
36

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

nohup <command> & disown

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

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

我在这个页面上nohup找到了和disown信息,以及这个 SO 答案中的信息。&

于 2015-03-25T07:48:34.387 回答
9

我通常screen用于保持后台作业运行。

1)创建一个屏幕会话:

screen -S myScreenName

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

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

screen -d

或捷径ALT+A then d


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

screen -r myScreenName

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

screen -ls

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

于 2018-05-29T14:44:43.243 回答