惊喜:交互式 Bash 在单独的进程组中运行命令

惊喜:交互式 Bash 在单独的进程组中运行命令

让我惊讶的是,至少从 Bash 4.4.19 开始,Interactive Bash 在单独的会话中运行命令,运行后请参阅以下进程列表sleep 8888

PGID    PID       PPID
3150071 3150071  252603     -bash
3194323 3194323 3150071       sleep 8888

您可以看到PGIDofsleep不等于 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;为此,它在不同的进程组中运行每个管道。

作业控制部分在 Bash 手册中。如中所述信号部分,Bash 显式地向相关进程组重新发送信号;情况也一直如此。

相关内容