Linux 中如何杀死级联?

Gai*_*ius 1 process kill

假设我有进程 A 产生进程 B,产生进程 C。在什么情况下杀死 A 会杀死整个链(或我猜是树),什么时候不会?我有时发现它确实如此,有时 B 以 ppid 1 结束而 C 未受影响。

这种行为是否因特定的 Linux 内核版本而异?

Cel*_*ada 5

kill()系统调用和kill外壳命令可用于杀死任一进程或进程组。无论哪种方式,永远都没有“级联”。

  • kill()系统调用或killshell 命令被赋予一个正整数时,这表示一个进程。信号被发送到那个进程而不是其他进程。

  • kill()系统调用被赋予一个负整数或killshell 命令被赋予以%(例如%1%2)开头的作业标识符时,信号会同时发送到进程组的所有成员。进程组是一种作业控制功能。在交互式 shell 使用中,每个 shell 管道(如sed s/foo/bar/ | cat -n | gzip)由 1 个或多个进程组成,这些进程都属于同一进程组。

(对于系统调用,有一些额外的情况:-1发送给每个进程,0发送给自己)。

这并不意味着当一个进程终止时,另一个进程也不会因为其他原因而终止。例如:

  • 一个产生子进程的进程可能会拦截一个终止信号并将它传递给它创建的子进程,然后它自己退出,作为在它自己之后进行清理的一种手段。
  • 当 shell 管道中的较早进程(例如上述进程)死亡(出于任何原因)时,shell 管道中的较晚进程通常也会立即终止,因为它们不再接收任何输入。

内核根本不对此类“额外”后果负责,它们取决于所涉及的软件的行为方式。