前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ulimit -t 设置引起进程被Kill掉

ulimit -t 设置引起进程被Kill掉

作者头像
EltonZheng
发布2021-01-26 10:49:47
8340
发布2021-01-26 10:49:47
举报

今天看到某篇帖子反馈

某台机器的ulimit -t 不知道为啥是300, 这是不是意味着程序占用CPU 300秒后会收到SIGKILL ? 我用gdb跑mysqld 跑了一会,收到SIGKILL信号,没有配置cgroup,也没啥后台脚本,看了下,就ulimit -t 比较诡异,其他机器都是unlimited。

我查了一下我的机器

代码语言:javascript
复制
$ ulimit -t
unlimited

简单的man ulimit下手册说:

-t The maximum amount of cpu time in seconds

貌似限制的是CPU最大执行时间,以秒为单位。 为了验证上面的说法,我特地设计了以下的场景:我们首先运行一个死循环程序消耗CPU时间,同时把进程的最大CPU消耗时间设定在180秒,期待在这个时间点进程会被杀掉。 以下是验证过程:

代码语言:javascript
复制
$ 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脚本来确定到底谁杀死了我们的进程:

代码语言:javascript
复制
$ 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信号,属于自杀.

查看Linux对应内核程序 ./kernel/posix-cpu-timers.c:1139

代码语言:javascript
复制
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限制就简单粗暴的让进程被自杀了。

文章参考:http://blog.yufeng.info/archives/2311


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档