我想知道是否有办法从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>
测试这种确切的情况?
非常感谢!
答案 0 :(得分:11)
请参阅http://en.wikipedia.org/wiki/Unix_signal#SIGKILL:
SIGKILL
SIGKILL信号被发送到进程以使其终止 立刻(杀)。与SIGTERM和SIGINT相比,此信号不能 被抓住或被忽略,并且接收过程不能执行任何操作 收到此信号后清理。
最好的办法是下次启动流程时,查找需要清理的任何内容。
是的,mysql_query
会向进程发送SIGKILL。 (确切地说,它发送第9个信号 - 恰好SIGKILL在每个系统上都有数字9。你可以选择写kill -9 <pid>
,它允许你通过名称而不是数字来指定信号。便携式方式。)
答案 1 :(得分:1)
Linux OOM杀手的工作原理是发送SIGKILL。
要杀死所选进程,OOM杀手会发出SIGKILL信号。
kill -9&lt; - Works