![为什么我的子进程的 PGID 不是父进程的 PID?](https://linux22.com/image/38873/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%E5%AD%90%E8%BF%9B%E7%A8%8B%E7%9A%84%20PGID%20%E4%B8%8D%E6%98%AF%E7%88%B6%E8%BF%9B%E7%A8%8B%E7%9A%84%20PID%EF%BC%9F.png)
所以我一直在到处读到这个命令应该终止父进程的所有子进程:
kill -- -$$
在kill命令中使用负ID会引用PGID,从我看到的示例来看,子进程的PGID应该是父进程的PID,但在我的系统上情况并非如此。
在我的系统上,子脚本的 PGID 与父脚本的 PGID 相同,而父脚本是 bash。
这里发生了什么?这些示例是错误的还是我的系统设置不同?
我需要实现的是终止子进程而不终止父进程,因此我不想向父进程所在的 PGID 发送终止信号。
答案1
当一个进程被分叉时,它会从其父进程继承其 PGID。当进程成为进程时,PGID 会发生变化流程组组长,然后从其 PID 复制其 PGID。从那时起,它生成的新子进程及其后代将继承该 PGID(除非它们启动自己的新进程组)。
在具有作业控制的 shell 中,例如大多数交互式 shell,每个作业都放在自己的进程组中。如果运行 shell 脚本,则运行该脚本的 shell 进程将成为组长,并且 PGID 将等于其 PID。
在没有作业控制的 shell 中,例如大多数用于运行脚本的 shell,命令在 shell 的进程组中运行。
该语法kill -- -N
会杀死 PGID = N 的组中的所有进程。您不能将其与任意 PID 一起使用,只能与进程组领导者的 PID 一起使用,因为那是 PGID。这基本上就是 shell 的方式
kill %jobid
语法有效——它在内部转换%jobid
为作业的 PGID 并将信号发送到该 PGID。
没有简单的方法可以从另一个 shell 脚本在其自己的进程组中运行脚本。看如何设置shell脚本的进程组不过,需要一些建议。