为什么我的 shell 启动的后台作业比父 shell 和控制终端的寿命更长?

Rog*_*ach 6 shell bash terminal nohup

通常说“&”将进程置于后台执行,但是当终端关闭时该进程将被终止。但是从我看来,我发送到后台的所有内容在我关闭终端后很长一段时间内仍然处于活动状态。例如:

$ tail -f /var/log/messages/ &
Run Code Online (Sandbox Code Playgroud)

该进程将继续运行,即使启动它的用户下没有其他进程,并且所有终端早已消失。这是为什么?

jw0*_*013 7

只是一个猜测(这是bash特定的):该文档huponexitshell选项说

如果设置,当交互式登录 shell 退出时,Bash 将向所有作业发送 SIGHUP

在我的系统上,它似乎没有默认设置。你可以检查

shopt -p huponexit
Run Code Online (Sandbox Code Playgroud)

如果输出包括-u,则未设置。


Pau*_*lin 5

当需要终端进行输入或输出并发现它不存在时,使用 '&' 而不是 nohup 置于后台的进程将死亡。在这种情况下,tail可能会在某些内容写入 /var/log/messages 时退出,尽管可能存在一些缓冲区问题会延迟它直到写入多条消息。

用 启动进程./foo > /dev/null 2&1 < /dev/null大致相当于用 nohup 启动。基本上, nohup 所做的就是将所有尚未重定向到终端之外的输入和输出重定向。