crontab在一秒内刷新多次导致部分脚本不生效的问题分析
版权声明:本文由康中良原创文章,转载请注明出处:
文章原文链接:https://www.qcloud.com/community/article/182
来源:腾云阁 https://www.qcloud.com/community
今天ob在几台DB上发现crontab中的监控任务,从来没有执行。但操作一下crontab的配置crontab –e + wq
,监控任务就能正常执行,重启cron也能正常执行。
出问题的机器crontab的情况如下:
问题挺奇怪,第一条crontab执行正常,第二条crontab一直没有执行。
第一条正常,证明cron有正常运行。DB监控任务的crontab是凯丽系统自动安装的,理论上不会存在突然出错的情况。
问题定位:
cron出bug了? 第二个任务确实没有执行,还是执行前遇到问题退出,刚好日志又打印到/dev/null
了..
考虑到crontab执行历史在系统日志里会有记录,检查var/log/message
日志如下,整*/5
的分钟点只有crontab的第一个任务。
crontab第二个任务确实没执行,应该是crontab出了点问题,再看看在修改crontab的那一刻发生了什么?
根据crontab最后一次修改的时间(2012-06-18 17:51:01),检查系统日志如下:
刚巧,在同一秒内修改了2次crontab。根据凯丽安装监控的顺序,第一个crontab应该是在安装第一条crontab任务,第二个crontab应该是在安装第二个crontab任务。
猜想:根据cron的工作原理,难道在增加第一个任务之后,cron加载了crontab的配置(/var/spool/cron/tabs/mysql
),但是在增加第二个任务之后,cron没有加载该配置? 如果是这样,那么cron判断是否需要加载配置文件的机制是如何的呢?
网上文档稀少,直接看代码。
在网上找到一个debian的cron源代码: cron_3.0pl1.orig.tar.gz
解压打开,查看cron的执行过程:
在cron.c 的main函数中,cron的主函数代码如下:cron_sleep()
: crontab 最小执行单位是分钟,因此是每60秒执行一次.TargetTime += 60;
load_database()
: 检查crontab的配置文件是否有更新,如果有更新,则重新load,否则使用上次记录的database cron_tick( ): 实际执行任务查看cron是如何加载crontab的配置文件的,进入load_database()函数.
database.c :
可以看到,在cron加载配置的时候,会先获取/var/spool/cron/tabs
目录stat信息,然后获取用户的crontab配置文件的stat信息,然后比较上一次统计的修改时间与tabs目录、crontab配置文件的最后修改时间,如果一致则不重新load,否则重新load crontab配置文件。
stat为系统函数调用,该函数取得的结构体的st_mtime
的单位为秒。
至此,我们可以得出这样的结论:
由于两次crontab修改时间均在同一秒,而cron的加载是以crontab配置文件的最后修改时间(秒级)来判断文件是否需要更新。当出现以下场景,第二次对crontab的修改就会失效(不仅是增加)。
crontab失效的场景:
而这个场景,刚好是我们的DB出现crontab失效的情况。
crontab的刷新机制,是以crontab文件的最后修改时间为准.
因此,如果在一秒内对crontab进行多次(大于1次)操作,就可能出现后修改的crontab不执行!
当再次对crontab文件进行保存操作时,cron会重新加载配置文件,crontab生效.
解决办法:
该问题是由于在一秒内执行多次crontab变更导致。因此解决办法有3个:
在凯丽每次操作crontab的时候增加sleep 1的操作
在凯丽每次crontab操作完成之后,sleep 1,强制刷新crontab的最后更新时间
合并并行的crontab操作为一次操作,减少对crontab的操作频率
根据凯丽的情况,选择第二个方案对现有代码改动最小。
提醒:
脚本尽量不要在同一秒内多次操作crontab内容,否则可能导致crontab不生效的情况。
crontab在一秒内刷新多次导致部分脚本不生效的问题分析的更多相关文章
- 第三方apk内置因签名导致SystemUI未启动启动问题案例分析
这个问题是刷完机正常开机后,发现手机无状态栏,下拉通知栏,按音量键也无法出现VolumeDialog,开始看到这个现象感觉是systemUI未编译到版本中去?或者是在systemserver中syst ...
- Jquery插件实现点击获取验证码后60秒内禁止重新获取
通过jquery.cookie.js插件可以快速实现“点击获取验证码后60秒内禁止重新获取(防刷新)”的功能 先到官网(http://plugins.jquery.com/cookie/ )下载coo ...
- Linux crontab 实现每秒执行
Linux crontab 实现每秒执行 linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. 1.使用延时来实现每N秒执行 创建一个php做执 ...
- python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据
python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据 最近工作太忙了,有一个星期没有更新文章了,本来这一期打算分享一些对龙虎榜数据的分析结果的,现在还没有把数据内的价值很好 ...
- 通向高可扩展性之路(推特篇) ---- 一个推特用来支撑1亿5千万活跃用户、30万QPS、22MB每秒Firehose、以及5秒内推送信息的架构
原文链接:http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active ...
- OAF 使用 javascript 使某个按钮在5秒内不能重复点击
首先要保证按钮是BUTTON,并且按钮事件设置firePartialAction. public class CuxXXXXPGCO extends OAControllerImpl { public ...
- 【转】安装Intel HAXM为Android 模拟器加速,30秒内启动完成
http://www.cnblogs.com/Li-Cheng/p/4351966.html http://www.cnblogs.com/csulennon/p/4178404.html https ...
- 安装Intel HAXM为Android 模拟器加速,30秒内启动完成
要求 必备知识 windows 7 基本操作. 运行环境 windows 7(64位); Android Studio 1.1.0;JDK 1.7.0_75(64位);android-sdk_r24 ...
- 微信公众号-5秒内不回复测试并处理方案,顺便复习php 时间执行
在index.php中 file_put_contents('has_request.txt','请求时间:'.date('YmdHis')."\n",FILE_APPEND); ...
随机推荐
- easyui.combotree.search.js
(function ($) { //combotree可编辑,自定义模糊查询 $.fn.combotree.defaults.editable = true; $.extend($.fn.combot ...
- zookeeper系列之二—zookeeper历史
Zookeeper是什么? Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby的一个开源版本.它是为分布式应用提供一致性服务的软件,提供的功能包括:配置服 ...
- InstallShield 打包时需要注意
32位的程序可以在64位运行,但64位的程序不能再32位上运行 32位的包和64位的包要分开打,不然在32位的机器上安装不上
- php5.3之前版本升级至5.3以及更高版本后部分语法简单归纳
1. Deprecated: Assigning the return value of new by reference is deprecated in /usr/local/www/uugui/ ...
- Android-图片按钮汇总
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- MSChart BarChart
不让合并0-5 chart1.ChartAreas[].AxisX.LabelStyle.Interval = ; 效果
- chmod 无法修改磁盘文件的权限解释 (光盘文件就是只读的,修改不了的)
我们知道root用户是linux执行权限最高的管理者用户,他可以进行任何的权限操作:然而我们的操作系统同样也考虑过这样的弊端,就是当我们使用者并不了解文件属性和重要性时会给予我们使用者提示: 举个例子 ...
- jquery之 css()方法。用法类似的有attr(),prop(),val()
[注]attr(),prop(),val()的用法结构和css()一致,可参考 css()函数用于设置或返回当前jQuery对象所匹配的元素的css样式属性值. 该函数属于jQuery对象(实例).如 ...
- 1:CSS中一些@规则的用法小结 2: @media用法详解
第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下 at-rule ...
- [SAP ABAP开发技术总结]ABAP程序之间数据共享与传递
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...