ulimit -t 引起的kill血案
来源:互联网 发布:html5 双屏互动源码 编辑:程序博客网 时间:2024/05/22 04:31
转载自Erlang非业余研究
原文链接: http://blog.yufeng.info/archives/2311
今天在内核群里印风同学问了个问题:
某台机器的ulimit -t 不知道为啥是300, 这是不是意味着程序占用CPU 300秒后会收到SIGKILL ?
我用gdb跑mysqld 跑了一会,收到SIGKILL信号,没有配置cgroup,也没啥后台脚本,看了下,就ulimit -t 比较诡异,其他机器都是unlimited。
简单的man ulimit下手册说:
-t The maximum amount of cpu time in seconds
貌似限制的是CPU最大执行时间,以秒为单位。
为了验证上面的说法,我特地设计了以下的场景:我们首先运行一个死循环程序消耗CPU时间,同时把进程的最大CPU消耗时间设定在180秒,期待在这个时间点进程会被杀掉。
以下是验证过程:
$
uname
-r
2.6.32-131.21.1.tb477.el6.x86_64
$
ulimit
-t 180
$
ulimit
-t
180
$
cat
busy.c
int main(int argc, char *argv[]) {
for
(;;);
return
0;
}
$ gcc busy.c
$
time
./a.out
Killed
real 3m0.029s
user 2m59.966s
sys 0m0.007s
从现象来看,3分钟后我们的busy进程确实被杀了,dmesg也没说什么原因被杀。
不过不怕我早有准备,提早在运行的同时在另外一个终端开了个stap脚本来确定到底谁杀死了我们的进程:
$
cat
sigkill.stp
probe signal.send{
if
(sig_name ==
"SIGKILL"
)
printf
(
"%s was sent to %s (pid:%d) by %s uid :%d\n"
, sig_name, pid_name , sig_pid, execname(), uid())
}
$
sudo
stap sigkill.stp
SIGKILL was sent to a.out (pid:23700) by a.out uid :50920
我们可以看的很清楚是./a.out给自己发的kill信号,属于自杀非他杀,行为有点意思吧!
木名同学找了下内核代码确认了以上行为:
./kernel/posix-cpu-timers.c:1139
if
(psecs >= sig->rlim[RLIMIT_CPU].rlim_max) {
/*
* At the hard limit, we just die.
* No need to calculate anything else now.
*/
__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
return
;
}
if
(psecs >= sig->rlim[RLIMIT_CPU].rlim_cur) {
/*
* At the soft limit, send a SIGXCPU every second.
*/
__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
if
(sig->rlim[RLIMIT_CPU].rlim_cur
< sig->rlim[RLIMIT_CPU].rlim_max) {
sig->rlim[RLIMIT_CPU].rlim_cur++;
}
}
内核的代码解释的很清楚,超过硬CPU限制就简单粗暴的让进程被自杀了。之前我还说内核不大可能这么狠,没想到。。。
- ulimit -t 引起的kill血案
- 房价引起的血案
- 一句话引起的血案
- 一个ID引起的血案
- 一个笔误引起的血案
- 一个引号引起的血案
- 死循环引起的血案
- 一个斜杠引起的血案
- 易语言4.13引起的血案
- NaN引起的血案(C语言)
- 重装Oracle引起的血案…
- process太大引起的另类血案
- 一个变量定义引起的血案
- 字节对齐方式引起的血案
- 【jsp勘误】一个return引起的血案
- Shell中空格引起的血案
- 由硬盘故障引起的一系列血案
- mysql修改用户表引起的血案
- ssh免密码登录配置
- MyEclipse下debug调试
- android操作sdcard中的多媒体文件(一)——音乐列表的制作
- typedef 和 函数指针
- cracking iPhone 5
- ulimit -t 引起的kill血案
- Qt 进程间通信(IPC)
- win7 里配置iis 和asp.net步骤,及发布asp.net网站全程
- 从context(相当于request)中获取对象
- git reset
- throw和throw ex的区别
- 软件的架构与设计模式之模式的种类
- 周星驰被曝圈内口碑差 曾让人用真酒瓶砸昏演员
- 多次格式化后,datanode无法启动