![惊喜:交互式 Bash 在单独的进程组中运行命令](https://linux22.com/image/220848/%E6%83%8A%E5%96%9C%EF%BC%9A%E4%BA%A4%E4%BA%92%E5%BC%8F%20Bash%20%E5%9C%A8%E5%8D%95%E7%8B%AC%E7%9A%84%E8%BF%9B%E7%A8%8B%E7%BB%84%E4%B8%AD%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
让我惊讶的是,至少从 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 信号退出。
编辑:我应该使用术语“进程组”而不是“会话”。
答案1
严格来说,具有作业控制的交互式 Bash 单独运行命令进程组,而不是会话:
SESS PGID PID PPID COMMAND
1082760 3784151 3784151 1082760 bash
1082760 3784782 3784782 3784151 sleep 120
据我所知,情况一直如此(至少自 Bash 2.0 以来);我在 Bash 变更日志中找不到相关变更的引用。当启用作业控制时,bash 需要能够在用户按下 时将管道移动到后台CtrlZ;为此,它在不同的进程组中运行每个管道。