【问题标题】:What would cause a SIGTERM to not propagate to child processes?什么会导致 SIGTERM 不传播到子进程?
【发布时间】:2016-04-03 18:16:36
【问题描述】:

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

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

【问题讨论】:

  • 谢谢。这消除了我一直有的很多困惑,我认为子进程由于某种原因被自动杀死了,我很困惑。

标签: linux fork sigterm


【解决方案1】:

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

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

如果您想确保在您的进程收到SIGTERM 时清除子进程,请安装信号处理程序并自己执行。

【讨论】:

  • 顺便说一句,内核向所有进程发送 SIGKILL 和 SIGINT,控制终端是发送信号的进程。此外,发送到一组进程的信号会被发送到多个进程(SIGHUP 被发送到会话所有者的进程组)
【解决方案2】:

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

要知道 pgid,请使用ps a -o pgid,command

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多