退出 zsh,但是保留正在运行的作业?

刚从 bash 切换到 zsh。

在 bash 中,后台任务在 shell 退出时继续运行:

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

这就是我想要的默认行为。

相反,zsh 的行为是对在 exit上运行作业发出警告,如果再次运行 exit,则关闭它们。例如,在这里,当第二个 exit-命令实际退出 shell 时,dolphin被关闭:

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

我如何使 zsh 的默认行为在这里像 bash 一样?

47278 次浏览

来自 Zsh 文档:

HUP

在 zsh 中,如果在 shell 退出时有一个后台作业正在运行,那么 shell 会假设你想要它被终止; 在这种情况下,它会发送一个特定的信号 SIGHUP... ... 如果你经常启动一些即使在 shell 退出时也应该继续的作业,那么你可以设置选项 NO_HUP,后台作业将不会被关闭。

因此,只需设置 NO_HUP选项:

% setopt NO_HUP

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

nohup <command> & disown

虽然我在 bash中只使用了 &,但是我发现在运行命令时(比如调用 java run 命令的脚本)只使用 nohup&disown时,当 shell 退出时,进程仍然会停止。

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

我在 这一页找到了 nohupdisown的信息,在 这么回答找到了 &的信息。

更新

当我最初编写这个程序时,我使用它来处理数据脚本/程序。对于这些类型的用例,类似于 ts(任务假脱机程序)的东西工作得很好。

&!开始程序:

dolphin &!

&!(或者相当于 &|)是一个特定于 zsh 的快捷方式,可以同时快捷到 背景 还有 断绝关系进程,这样退出 shell 就可以让它继续运行。

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

1)创建屏幕会话:

screen -S myScreenName

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

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

screen -d

或者 捷径 ALT+A then d


几百年后——如果你想恢复你的会话(重新附加) :

screen -r myScreenName

如果你想知道是否有一个屏幕会话,它的名称和它的状态(附加或分离) :

screen -ls

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