Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 退出zsh,但保持正在运行的作业处于打开状态?_Bash_Zsh_Jobs - Fatal编程技术网

Bash 退出zsh,但保持正在运行的作业处于打开状态?

Bash 退出zsh,但保持正在运行的作业处于打开状态?,bash,zsh,jobs,Bash,Zsh,Jobs,刚从bash切换到zsh 在bash中,后台任务在shell退出时继续运行。例如,此处,dolphin在退出后继续运行: $ dolphin . ^Z [1]+ Stopped dolphin . $ bg [1]+ dolphin . & $ exit 这就是我想要的默认行为 相反,zsh的行为是警告在exit上运行作业,如果再次exit,则关闭作业。例如,当第二个exit-命令实际退出shell时,dolphin关闭: % dolphin . ^

刚从bash切换到zsh

在bash中,后台任务在shell退出时继续运行。例如,此处,
dolphin
在退出后继续运行:

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

来自:

HUP

。。。在zsh中,如果您在shell退出时有一个后台作业正在运行,那么shell将假定您希望该作业被终止;在这种情况下,它被发送一个名为
SIGHUP
。。。如果您经常启动即使在shell退出时也应该继续的作业,那么您可以设置选项
NO\u HUP
,后台作业将不受影响

因此,只需设置
NO\u HUP
选项:

% setopt NO_HUP

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

nohup <command> & disown
nohup&disown
虽然我在
bash
中使用了
&
,但我发现,在运行命令时仅使用
nohup
&
disown
,比如调用java运行命令的脚本,当shell退出时,进程仍然会停止

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

我在中找到了
nohup
disown
信息,在中找到了
&
信息。

&>启动程序

dolphin &!

&
()是一个特定于zsh的快捷方式,用于后台断开进程,这样退出shell将使其保持运行。

我通常使用
屏幕
来保持后台作业运行

1)创建屏幕会话:

screen -S myScreenName
2)启动您的脚本、服务、守护进程或任何东西

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

screen -d
或 快捷方式
ALT+A然后是d


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

如果您想知道是否有屏幕会话、其名称及其状态(已连接或已分离):


此解决方案适用于所有终端解释器,如bash、zsh等。
如果您不想看到警告,请参见
man screen

,是的。为完整起见,您还可以列出启动后如何断开该警告?@trusktr。我认为为了清晰起见最好分开。对于任何对zsh特别感兴趣的人,我已经问过了。我喜欢这个解决方案,我将为单个命令实现它,但我仍在寻找一种方法来更改zsh的默认行为。@Vince您的意思是将默认更改为始终拒绝后台进程吗?如果是这样,您可以在
~/.zshrc
中使用
setopt nohup
来执行此操作。然后以
&
为背景启动命令也将始终拒绝该命令。尽管默认情况下,当您尝试退出时,zsh仍会提醒您有正在运行的作业。你也可以用
setopt nocheckjobs
@DimiDak关闭它,这对我来说也很好<代码>别名z=“sudo sleep 1&|”
。构造这样的最小示例,最终会缩小范围。MacOS用户需要注意的是,从屏幕分离的键盘快捷键是Control+A,然后是D。当我让进程运行并屈服于标准输出时,这也是我唯一的选择,在那个里写screen-d并没有什么帮助。很好,但和Q无关,Q是关于如何在退出ZSH时保持bg任务运行的。
screen -r myScreenName
screen -ls