Python SIGKILL 捕获策略

13

我想知道是否有办法捕获OOM killer发送的sigkill信号。我有一个任务队列,偶尔会创建一个巨大的任务,被OOM杀死。以下是代码:

catch Exception as ex:
    # clean up!

无法使用,因为SIGKILL不能被捕获。那么有没有任何清理SIGKILL后果的策略?我可以fork进程并监视子进程吗?如果可以,父进程是否必须事先知道子进程打开的所有资源?还是我只需要做某种版本的

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

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

最后,仅仅执行以下操作是否足够:

kill -9 <process id> 

要测试这种确切情况吗?

非常感谢!

2个回答

23

SIGKILL 本质上无法被捕获。

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

SIGKILL

SIGKILL信号被发送到一个进程中,以立即终止(杀死)该进程。与SIGTERM和SIGINT不同,该信号无法被捕获或忽略,并且接收进程在接收到该信号后无法执行任何清理操作。

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

是的, kill -9 <pid>会向进程发送SIGKILL。(准确地说,它发送第9个信号 - 在几乎每个系统上,SIGKILL都具有数字9。您还可以使用kill -KILL <pid>,该命令允许您以可移植的方式按名称而非按数字指定信号。)


有没有关于如何清理的最佳实践或传统智慧?如果我有10个东西打开一个子进程...我应该寻找父ID == 1的进程,并强制杀死它们吗?我有点惊讶,居然没有一种常见的方法来做这件事...但我猜如果这是一个相当不常见的事情,每个人都会想出自己的方法? - Hoopes
如果您有一堆子进程,它们必须有某种机制来监视其他进程是否被杀死。 - Mike Shoup
顺便提一下,我使用了优秀的psutil库来完成这个任务——在下一次进程运行时进行清理,通过搜索具有ppid为1的预期进程名称,由进程用户拥有。 - Hoopes

2

Linux OOM killer通过发送SIGKILL信号来工作。

为了杀死选择的进程,OOM killer会发送一个SIGKILL信号。

kill -9 <-- 可行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接