安全终止进程组

安全终止进程组

如何安全地终止一个进程组,并在必要时强制终止?

目标是使用 SIGTERM (-15) 来终止应用程序,然后如果树中的应用程序在超时(例如 60 秒)后没有终止,则执行 SIGKILL (-9)。

我们有一个场景,其中父进程和子进程共享一个 pgid,例如

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

目前我们正在向进程组发送 SIGTERM (-15),然后如果父进程已死亡,则假定成功。

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

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

  1. 为什么如果子进程没有死,父进程的 pid 也会死(这可能吗,或者我的假设是错误的)?

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

答案1

  1. 如果父进程关心子进程的终止状态,则必须显式地等待子进程的终止。默认情况下,孤儿进程将转移到 init (pid1) 而不是终止。
  2. 不幸的是,当它们被 init 收养时,它们的 pgid 会变为它们自己的 pid(orphan 成为其自己的会话和 pg 领导者)。

如果要确定,您必须列出 pg 中的所有 PID,然后轮询以确保它们已死亡。当领导者死亡时,进程组本身也会解散,因此您无法监视该 pgid 中的进程。

如果你真的非常想确定(因为 PID 可以在非常繁忙的系统上重复使用),你需要执行深度优先进程树遍历,从父到子,并杀死子节点,等待每个节点终止后再杀死下一级,但你可能会遇到父节点重生其死亡子节点的情况。这个答案处理这种极端情况。

相关内容