7

我在 Linux 上有一个通过 fork 启动 20 个子进程的进程。当我杀死父进程时,它通常会杀死所有的子进程,但有时它不会杀死所有的子进程,我会留下一些孤立的进程。这不是启动时的竞争条件,这是在进程处于活动状态几分钟之后。

什么样的事情会导致 SIGTERM 无法正确传播到某些子进程?

4

2 回答 2

8

进程树中的子进程不会自动传播信号(SIGTERM 或其他)。

由于可以观察到杀死父进程会导致一些子进程退出,这是由于辅助效应 - 例如SIGPIPE当子进程尝试读取或写入管道时,另一侧的父进程已死亡。

如果您想确保在您的进程收到 a 时清理孩子SIGTERM,请安装一个信号处理程序并自己做。

于 2015-12-29T22:54:16.840 回答
3

如果您在发送信号时使用进程组 ID (pgid),则该信号将传播到父进程及其所有子进程。

要了解 pgid,请使用ps a -o pgid,command.

于 2016-11-25T11:11:55.697 回答