令我惊讶的是,至少从 Bash 4.4.19 开始,Interactive Bash 在单独的会话中运行命令,运行后请参阅以下进程列表sleep 8888
:
PGID PID PPID
3150071 3150071 252603 -bash
3194323 3194323 3150071 sleep 8888
您可以看到PGID
ofsleep
不等于 bash,而它的 PPID 等于。
测试在 Ubuntu Bionic 上完成。
是否有任何关于此行为更改的文档?还是从一开始就这样?
在单独的会话中运行命令意味着当 bash 退出时根本不会发生 SIGHUP 效果,也许这就是为什么https://www.sobyte.net/post/2022-04/linux-nohup-setsid-disown/#about -说
事实上,在较新版本的 bash 上,bash 不会向后台程序发送 SIGHUP 命令。这意味着任何在后台运行的以 & 结尾的进程都不会被终端退出的 SIGHUP 信号退出。
编辑:我应该使用术语“进程组”而不是“会话”。
严格来说,具有作业控制的交互式 Bash 在单独的进程组中运行命令,而不是会话:
据我所知,情况一直如此(至少,自 Bash 2.0 以来);我在 Bash 更新日志中找不到相关更改的参考。启用作业控制后,bash 需要能够在用户按下时将管道移动到后台CtrlZ;为此,它在不同的进程组中运行每个管道。
请参阅Bash 手册中有关作业控制的部分。如信号部分所述,Bash 显式地向相关进程组重新发送信号;情况也一直如此。