关于python捕获内核发出的sigkill信号问题

The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

signal的sigkill信号,也就是kill -9 pid是无法在程序内部捕获的,那怎么办?你反抗不了,一般关于sigkill的日志会在/var/log/messages里,如果非deamon程序在终端也是有日志体现的。对于内核暴力完杀,你只能找到原因避开程序的sigkill信号。

再次申明下,程序是无法捕获sigkill的信号,在python下注册sigkill捕获事件,直接给你扔出个runtimeError异常. 



该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。 http://xiaorui.cc/?p=3121

#xiaorui.cc
In [3]: def trycache(*args):
   ...:     print args
   ...:

In [4]: signal.signal(signal.SIGKILL,trycache)
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-4-7f0697d1acc4> in <module>()
----> 1 signal.signal(signal.SIGKILL,trycache)

RuntimeError: (22, 'Invalid argument')

一般我们常用的kill信号有这么几种, 而sigterm 也就是直接kill pid是默认信号.

SIGINT 2 用户调试终止进行中断,一般是键盘(Ctrl + C)。
SIGABRT 6 调用abort函数产生(通常是自杀)。
SIGTERM 15 kill命令发送的默认终止信号。

插入一句, signal.signal(signal.SIGCHLD,func_sigchld) 可以捕获子进程exit前发出的sigchld,然后在func_sigchld定义waitpid()来收拾。这样可以避免僵尸进程的存在。 另外要注意信号不排队的问题,你可以循环检查waitpid()子进程的状态. 

我们再来说说, 一般什么时候会发生内核sigkill你的应用程序,这里不聊你自己手动去kill -9 pid。

1. 一般是你的程序写的不严谨,内核要给别人分配内存时,一看没有可用的,这时候就可能会把你给宰了,专业说法是内存泄漏引起的OOM killer.


2. 如果你的应用超出你设置的cpu使用时间,那么也会被kill,可以使用ulimit -t查看。 
ulimit -t
cpu time               (seconds, -t) unlimited

3. 权限安全问题,这个倒是没啥,咱们很容易分析出来.
$ touch /var/xiaorui.cc
touch: /var/xiaorui.cc: Permission denied

SIGTERM vs. SIGKILL 区别?
sigterm 是可以捕获的,你可以针对该信号注册函数.
sigkill 如此文,无法捕获.

这两天又把linux系统编程过了一遍,受益匪浅 ! 推荐大家闲来无事时看看底层的东西,像我以前遇到僵尸进程,要不就直接全套孤儿进程的方案,要不就修复内部的逻辑.   看了这两天linux编程,才知道解决方案有多种多样.  


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

邮箱地址不会被公开。 必填项已用*标注