linux中crontab的打core问题分析

接到同事报障, 程序又crash了, 但是找不到core, 而且是应该产生core的, 系统肯定哪里又有bug了.

先从系统层面大概都巡查了一下:

1.  找到别的程序的pid号,然后cat /proc/pid/limits  |grep core,返回Max core file size        0            unlimited            bytes, 有大问题, Soft Limit值居然是0, 继续找原因.

2.  用程序用户执行ulimit -c, 返回unlimited, 系统设置没问题.

3.  sysctl -a |grep core_ , 查看core_pattern返回core.%p.%e , 没有目录存在与否和权限的问题.

4.  ssh XX.XX.XX.XX “ulimit -c ” , 远程登陆执行命令, 返回unlimited, 排除了我之前说的怪物世界不打core问题.

基本问题都查了一下, 貌似没问题,  但确实没打core, 问题在哪呢? 纠结. 又重复查了下 

还是没找到问题, 但是有些服务器和程序又反馈是正常的…. (省略一些无用功), 之前的文章说提到, 先ulimit -c unlimited ,然后重启sshd, 这样ssh过来的连接也默认有这个参数了, 也就是说, ulimit值为0 , 很有可能也是从上一级”父程序”继承到的. 看程序启动时间都是在同一个时间点, 查找bash记录和cron记录, 没有发现有谁手动设置ulimit 的core值然后启动游戏之类的, 只有cron的记录重启游戏. 莫非就是crontab的问题, ps -ef |grep crond找到crontab的进程id号, 然后进入proc目录查看他的limits文件,发现这个程序确实是0值, 也就是说crond被设置成了不打core, 然后他启动的任何程序, 除非手动申明过, 否则都不会打core, 然后简单验证:

在crontab里面加入计划任务运行/lib64/libss.so.2, 这是个库文件, 直接运行就会打core报错,  但是放在crontab里面确实没有打core, 就是这个问题了: crontab引起的不打core问题.

但是为什么呢, 为什么crond这个程序为什么没有设置为打core呢, 按理说, 是会继承bash的unlimited值, 除非自己另外设置过,  记得 /etc/crontab 里面可以设置crond的变量, 然后手动在里面指定unlimited值还是一样的无效, 查看 /etc/init.d/crond 启动文件, 发现也会加载/etc/sysconfig/crond这个设置文件, 然后手动指定, 结果还是无效. 在 /etc/init.d/crond文件里面几个地方设置”断点” ,加入 cat /proc/$$/limits| grep core , 结果都返回unlimited值, 又是一阵迷茫中.

继续设置”断点” ,结果在daemon启动crond的时候发现有些关键, 然后查找daemon的来源: /etc/rc.d/init.d/functions文件, 在里面发现了daemon函数的定义, 而且里面有个关键命令239行有个corelimit=”ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}” , 而且DAEMON_COREFILE_LIMIT这个变量没有地方设置, 想到之前设置snmp的日志问题, 同样在/etc/sysconfig/crond 里面加入DAEMON_COREFILE_LIMIT=unlimited然后重新启动crond就可以了. 不过这是针对crontab启动的程序, 另外我们经常有一些程序是用服务启动, 而且服务里面默认都会加载/etc/rc.d/init.d/functions这个文件, 如果想完全杜绝用系统服务启动的程序不打core这个情况, 直接把corelimit=”ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}”这行注释掉就可以了.

重新设置crontab, 运行/lib64/libss.so.2这个文件, 发现crash顺利打core了, crontab启动的程序已经可以顺利打core了, 貌似问题到此都解决了.

但是疑问又来了, 为什么有些服务器有些项目程序也是用crontab重启程序, 但是没有这个情况? 悲剧, 继续找问题…… (业务问题,省略), 问题找到了, 因为有些程序是另另外一个父程序守护, crontab重启那些游戏只是简单地kill掉程序, 然后又父程序自动启动, 然后这个父程序是用手动启动的, 是可以正常打core的, 所以不存在这个问题. 按理说这个情况又解释好了, 但是又有例外, 有个项目不是用守护启动的, 但是没有这个bug, 解释不通, 悲剧, 继续找问题.

整个流程几乎又重来了, 但是依然没有找到个解释说法, 重新浮动一个想法, 最开始之前就怀疑过开发老大们, 是否在程序里面手动设置过ulimit值, 但是说没有, 如果真没有, 那就解释不通了, 然后打算自己针对二进制文件进行简单分析:
在服务器上通过strings命令查看是否有ulimit和core之类的文本, 结果真地找到了, 里面有 set corefile size之类的文本, 肯定就是这个问题了, 继续找项目开发人员了解情况, 有说法了, 他们在程序里面加入了setrlimit函数,  这个函数是用来设置task进程使用资源的上限的. 就是这个问题了. 因为是针对自己启动的程序或者子程序, 所以普通用户也是可以设置这个值.

ok, 又有3个打core问题全部解释通了, 稍微总结一下:

1. crontab启动时候从系统函数那里得到core值为0导致启动的所有程序都是不打core的.

2. 守护程序启用了core, 他启动的程序都直接继承这个属性了.

3. 程序可以自己另外设置core值.

另外普及一下,查看正在运行的程序是否能产生core, 并不是让他crash掉, 而是通过proc文件系统里面的pid文件夹的limits文件. 这是之前一篇文章重点讲过的. powered by liu.

时间: 2024-09-16 11:41:45

linux中crontab的打core问题分析的相关文章

Linux中文件名解析处理源码分析

前言 Linux中对一个文件进行操作的时候,一件很重要的事情是对文件名进行解析处理,并且找到对应文件的inode对象,然后创建表示文件的file对象.在此,对文件名解析过程,并且如何找到对应inode的过程进行源码分析.分析代码基于Linux-3.2版本. 关键函数分析 不管是通过应用层的API函数还是在内核中打开一个文件,最终都需要调用filp_open函数,该函数的主要职责就是解析文件名,找到文件对应的inode对象,然后分配内存创建file对象,最后执行该文件对应的file->open函数

Linux中crontab任务计划不执行的问题分析

crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务. 使用权限: root用户和crontab文件的所有者 语法: crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ] 说明: cro

linux中crontab命令启动/重启/停止详解

linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令. 一.crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,cron

linux中crontab定时任务未执行错误总结

没有按照规范写以下的shell脚本导致执行失败通过CentOS中的定时任务执行shell脚本失败,进行排查: 1)手动执行shell脚本(sh backup.sh)成功执行,排除sh脚本的语法错误. 2)通过nano /etc/crontab命令查看定时任务,发现除过执行sh的定时任务外,其他任务都能正常执行.检查其代码, 发现对SHELL.PATH.MAILTO.HOME还没有好好了解过,以往都是注意下面的时间规则,所以查了一下定义: 1)SHELL,变量的值指定shell 环境(此处默认为

linux中crontab不能正常执行原因

1 crond服务未启动 crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止.如果停止了就无法执行任何定时任务了,解决的方法是打开它: crond 或 service crond start 如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装: yum -y install crontabs 2 权限问题 比如:脚本没有x执行权限,解决方法: 增加执行权限,或者用bash abc.sh的方法执行 3 路径问题 有的

linux中crontab 计划任务

1.作用 使用crontab命令可以修改crontab配置文件,然后该配置由cron公用程序在适当的时 间执行,该命令使用权限是所有用户. 2.格式  代码如下 复制代码 crontab [ -u user ] 文件 crontab [ -u user ] { -l | -r | -e } 3.主要参数 -e:执行文字编辑器来设定时程表,内定的文字编辑器是vi. -r:删除目前的时程表. -l:列出目前的时程表. crontab文件的格式为"M H D m d cmd".其中,M代表分

Linux中crontab命令参数与使用说明

定时任务常用的一个功能,详细如下: 服务的启动和停止 cron服务是linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: Linux代码 /sbin/service crond start  /sbin/service crond stop  /sbin/service crond restart  /sbin/service crond reload 以上1-4行分别为启动.停止.重启服务和重新加载配置. 要把cron设为在开机的时候自动启动,在 /etc/rc.d/rc

linux 中crontab格式详细说明

crontab是绝大多数Linux发行版都自带的一个定时执行程序的服务.通过crontab -e命令可以打开一个文本编辑器编辑当前用户的定时任务. 具体格式如下: 名称 : crontab 使用权限 : 所有使用者 使用方式 : crontab file [-u user]-用指定的文件替代目前的crontab. crontab-[-u user]-用标准输入替代目前的crontab. crontab-1[user]-列出用户目前的crontab. crontab-e[user]-编辑用户目前的

linux中crontab每秒执行任务的几种方法

第一种方法: 1.创建脚本文件  代码如下 复制代码 cat phplog.sh 2.编辑脚本内容 #!/bin/bash while : ;do /home/scripts.sh 2>/dev/null & sleep 1 done 注意:第一次运行时请不要使用bash phplog.sh & 这种后台运行的方式,它会僵死的. 解决:可以把它放到计划任务使其运行,然后将计划任务中的此条目删除即可.最后把这个脚本放到/etc/rc.local让它每次开机都可以被运行. 第二种方法: