【问题标题】:python sigkill catching strategiespython sigkill 捕捉策略
【发布时间】:2017-10-06 03:45:00
【问题描述】:

我想知道是否有任何方法可以从 OOM 杀手那里捕捉到 sigkill。我有一个任务队列,并且每隔一段时间就会创建一个被 OOM 杀死的庞大任务。这个:

catch Exception as ex:
    # clean up!

不起作用,因为 SIGKILL 无法被捕获。所以........在 SIGKILL 之后有什么策略可以清理吗?我可以分叉并观察子进程吗?如果是这样,子进程打开的任何资源都必须由父进程提前知道吗?或者我可以做一些版本的

ps -ef | grep <child pid> | xargs kill -9  (you get the idea...)

目前,如果我在 OOM 终止后不进行清理,我会留下大量子进程和其他东西,这只会在重试任务时使情况变得更糟,并且很快就会无法访问服务器。

最后,做就够了吗:

kill -9 <process id> 

要测试这个确切的情况?

非常感谢!

【问题讨论】:

    标签: python linux memory sigkill


    【解决方案1】:

    SIGKILL 就其本质而言不能被困住。

    http://en.wikipedia.org/wiki/Unix_signal#SIGKILL:

    信号杀死

    SIGKILL 信号被发送到进程以使其终止 立即(杀死)。与 SIGTERM 和 SIGINT 相比,该信号不能 被捕获或忽略,并且接收进程不能执行任何 收到此信号后进行清理。

    最好的办法是下次启动流程时,查找需要清理的任何内容。

    是的,kill -9 &lt;pid&gt; 将向进程发送 SIGKILL。 (准确地说,它发送第 9 个信号 - SIGKILL 几乎在每个系统上都有数字 9。您也可以编写 kill -KILL &lt;pid&gt;,它可以让您以可移植的方式通过名称而不是数字来指定信号.)

    【讨论】:

    • 有没有关于如何清理的最佳实践或传统智慧?如果我有 10 个东西打开一个子进程……我应该寻找父 id == 1 的进程,并强制杀死它们吗?我有点惊讶没有一种通用的方法来做到这一点......但我想如果它(应该是)一个非常罕见的事情,每个人都会想出自己的?
    • 如果你有一堆子进程,如果它们被杀死,它们必须有一些机制来监控其他进程。
    • FWIW,我使用了出色的 psutil 库来做到这一点 - 通过搜索进程用户拥有的 ppid 为 1 的预期进程名称,在进程的下一次运行时清理。
    【解决方案2】:

    Linux OOM 杀手通过发送 SIGKILL 来工作。

    为了终止选定的进程,OOM 终止程序会发送一个 SIGKILL 信号。

    杀死 -9

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 2023-04-04
      • 2013-05-20
      • 2016-09-26
      相关资源
      最近更新 更多