杀死进程组安全

如何能够安全地杀死一个进程组,并在必要时强制杀死?

我们的目标是用SIGTERM(-15)杀死,如果树中的应用程序在超时(例如60秒)之后没有死,请执行SIGKILL(-9)。

我们有一个父进程和一个subprocess的场景,共享一个pgid,例如

Parent Process pid=123, pgid=123 |- Child Process pid=456, pgid=123 

目前我们正在发送SIGTERM(-15)给进程组,如果父进程已经死了,那么就假设成功。

但是,有时候我们发现父进程死了,subprocess没有死。

所以这可以归结为两个问题:

  1. 为什么父母死亡,如果孩子没有死(这是可能的,或者我的假设是错误的)?

  2. 在将kill -9发送到进程组之前,检查进程组中是否有任何进程是确保树中所有进程都已经死亡的最好方法?

  1. 如果家长关心他们的终止状态,家长必须明确地等待()他的孩子。 默认情况下,孤立的孩子被转移到init(pid1),而不是终止。
  2. 不幸的是,当他们被init采纳时,他们的pgid改变了他们自己的pid(孤儿变成了自己的会话和pg领导者)。

如果你想确定的话,你必须列出pg中所有的PID列表,然后进行轮询以确定它们已经死亡。 当领导人死亡时,进程组本身解散,因此您无法监视该进程中的进程。

如果你真的想确定(因为PID可以在非常繁忙的系统上重用),你需要先深入处理父进程的树,然后杀掉子叶节点,等待每个进程在杀死下一个级别之前终止,但你可能会遇到父母重生他们的死亡孩子。 在这个答案中的脚本处理这个边缘情况。