我在Linux上有一个进程,可以通过fork启动20个子进程。当我杀死父进程时,它通常会杀死所有子进程,但有时它并不会杀死所有进程,而且我还留下了一些孤立的进程。这不是启动时的竞争条件,这是在进程激活几分钟之后。
什么样的事情可能导致SIGTERM无法正常传播到某些子进程?
答案 0 :(得分:2)
在进程树中没有向子节点自动传播信号(SIGTERM或其他)。
因为可以观察到杀死父进程导致一些孩子退出,这是由于辅助效应 - 例如当孩子尝试读取或写入管道时引起的SIGPIPE
另一方是死去的父母。
如果您想确保在流程收到SIGTERM
时清理孩子,请安装信号处理程序并自行完成。
答案 1 :(得分:0)
如果您在发送信号时使用进程组ID(pgid),则信号将传播到父进程及其所有子进程。
要了解pgid,请使用ps a -o pgid,command
。