Linux - 找到一个垂死进程的所有 child (我自己的孙子)

标签 linux daemon

场景:我们有一个 linux 守护进程,称之为 Alpha。 Alpha forks/execs 一个子进程,Bravo。 Bravo 然后生成几个子进程,称它们为 Charlie 和 Delta。

Alpha
  |
   \-Bravo
     |
      \-Charlie
     |
      \-Delta

Bravo 死了。 Alpha 安装了一个 sig 子处理程序,它会触发。

我如何从 Alpha 找到 Bravo 的所有 child (Charlie 和 Delta)以便我也可以杀死他们?

我观察到,一旦 Bravo 被杀死,Charlie 和 Delta 就会成为 init (pid=1) 的 child 。我要么需要能够 1) 在重新分配 Bravo 的 child 之前检查进程树,要么 2) 以某种方式确保 Bravo 的 child 由 Alpha 继承。如果是这样的话,我可以在我(Alpha)自己的 child 中找出谁是谁。

最佳答案

您可以为此使用进程组。当 Bravo 启动时,在它调用 execve() 之前,使用 setpgid(0, 0); 使其成为进程组领导。然后它的子进程将继承这个进程组(它的 PGID 等于 Bravo 的 PID,因此为 Alpha 所知)。

Bravo退出时,它的 child 会被init继承,但是他们的PGID不会改变。 Alpha 然后可以使用 kill() 一次性向它们发出信号,提供 PGID 的负值作为第一个参数。例如。在 Alpha 中,您可能会执行以下操作:

exited_child = wait(&status);
if (exited_child > 0)
     kill(-exited_child, SIGTERM);

关于Linux - 找到一个垂死进程的所有 child (我自己的孙子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6833026/

相关文章:

linux - update-rc.d 禁用/删除不会删除 etc/init.d/rc* 引用

php - 将 SNMP 陷阱数据包传递给 Ubuntu 上的 php 守护进程

c 守护进程运行时 shell 参数

linux - find - 如果省略 -name 和单引号会怎样?

PHP session 超时回调?

java - 通过 Runtime.exec() 执行时命令失败,但在 Raspberry Pi (Linux) 上手动执行时命令有效

php - 与守护程序文件 (JAXL) 交互

linux - Azure 应用服务 (Linux Nginx) 文件上传错误 413(有效负载太大)

linux - 像 "hadoop fs -ls"这样的 hadoop shell 命令是如何工作的?

linux - 守护进程和孤儿进程之间的区别?