Linux会话中父Shell是否属后台进程组及前台进程组确认
问题背景
执行的命令
$ sleep 100000 & $ sleep 100000 & $ bash -c '{ sleep 100000 & } && cat && sleep 500000'
当前进程树
SID PGRP PID Command ------------------------------------------------------------- 496410 496410 496410 -bash 496410 496427 496427 ├─ sleep 100000 496410 496430 496430 ├─ sleep 100000 496410 500081 500081 └─ bash -c { sleep 100000 & } && cat && sleep 500000 496410 500081 500082 ├─ sleep 100000 496410 500081 500083 └─ cat
进程树分析
-bash是会话领导者,因为PID == SID。- 该会话包含4个进程组(
PGRP = 496410, 496427, 496430, 500081)。
技术问题
- 一个会话最多只能有1个前台进程组,上述进程树中的前台进程组是否为
500081 bash -c { sleep 100000 & } && cat && sleep 500000? - 进程组
496427 sleep 100000和496430 sleep 100000显然是后台进程组,那么会话领导者496410 -bash是否也属于后台进程组496410?
问题解答
问题1解答
是的,进程组500081就是当前会话的前台进程组。
在交互式shell(此处的-bash)中执行不带&的命令时,shell会将该命令所在的进程组设为会话的前台进程组,终端的控制终端会绑定到这个前台进程组。第三条命令bash -c '...'未加&,属于前台执行的命令,因此它所在的进程组500081被设为前台进程组,原shell进程组496410转为后台状态。
从进程树也能佐证:cat进程正在等待终端输入,这是前台进程组的典型特征——可直接接收终端的输入输出。
问题2解答
会话领导者496410 -bash属于进程组496410,且此时该进程组是后台进程组。
会话同一时刻只能有一个前台进程组,当500081成为前台进程组后,原shell所在的进程组496410就处于后台状态。后台进程组无法直接接收终端输入(除非通过特定方式),但依然属于会话的一部分,你可以通过fg命令将其重新切换为前台进程组。
核心逻辑是:会话中的进程组只有前台、后台两种状态,同一时刻仅一个前台进程组,其余均为后台进程组,会话领导者所在的进程组也遵循此规则。
内容的提问来源于stack exchange,提问作者ynn
相关产品推荐
相关产品推荐

