12

我想知道是否有任何方法可以从 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> 

测试这个确切的情况?

非常感谢!

4

2 回答 2

19

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

请参阅http://en.wikipedia.org/wiki/Unix_signal#SIGKILL

杀戮

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

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

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

于 2015-06-09T13:10:52.123 回答
2

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

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

杀死 -9 <-- 有效

于 2015-06-09T13:02:07.320 回答