2015-06-09 41 views
4

我想知道是否有任何方法可以从OOM杀手中捕捉到sigkill。我有一个任务队列,而且每次都会创建一个被OOM杀死的巨大任务。这:python sigkill捕捉策略

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> 

来测试这个确切的情况呢?

非常感谢!

回答

8

SIGKILL不能被捕获。

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

SIGKILL

的SIGKILL信号被发送到一个进程,导致其终止 立即(杀死)。与SIGTERM和SIGINT相反,该信号不能被捕获或忽略,接收过程在接收到该信号后不能执行任何清理。

要做的最好的事情是下一次启动过程,寻找需要清理的任何东西。

是的,kill -9 <pid>会发送一个SIGKILL过程。 (准确地说,它发送第9个信号 - 只是SIGKILL在几乎所有的系统上都有9的数字,你可以写kill -KILL <pid>,它可以让你用便携的方式按名称而不是数字来指定信号。)

+0

有没有什么最佳实践或传统知识如何清理?如果我有10件事情打开一个子进程...我应该寻找与父母id == 1的进程,并强制杀死他们?我有点惊讶,有没有一种常见的方式来做到这一点......但我猜如果它(应该是)是一个非常罕见的事情,每个人都会有自己的想法? – Hoopes

+0

如果你有一堆子进程,他们必须有一些机制来监视其他进程是否被杀死。 –

+0

FWIW,我使用了优秀的psutil库来做到这一点 - 通过搜索期望的进程名称来清理进程的下一轮运行,其中ppid为1,由进程用户拥有。 – Hoopes

1

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

要杀死选定的进程,OOM杀手提供SIGKILL信号。

杀-9 < - 其本质工作