【问题标题】:Exit zsh, but leave running jobs open?退出 zsh,但让正在运行的作业保持打开状态?
【发布时间】:2013-10-18 15:14:24
【问题描述】:

刚从 bash 切换到 zsh。

在 bash 中,后台任务会在 shell 退出时继续运行。例如这里,dolphinexit 之后继续运行:

$ 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 一样?

【问题讨论】:

    标签: bash zsh jobs


    【解决方案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
    

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

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

    我在this page 找到了nohupdisown 信息,在this SO answer 找到了&amp; 信息。

    【讨论】:

      【解决方案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。
      • 需要更多支持
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      相关资源
      最近更新 更多