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


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


插入一句, 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编程,才知道解决方案有多种多样.  



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品