文档章节

crontab在一秒内刷新多次导致部分脚本不生效的问题分析

偶素浅小浅
 偶素浅小浅
发布于 2016/11/10 16:33
字数 1077
阅读 20
收藏 0

版权声明:本文由康中良原创文章,转载请注明出处: 
文章原文链接: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个:

  1. 在凯丽每次操作crontab的时候增加sleep 1的操作

  2. 在凯丽每次crontab操作完成之后,sleep 1,强制刷新crontab的最后更新时间

  3. 合并并行的crontab操作为一次操作,减少对crontab的操作频率

根据凯丽的情况,选择第二个方案对现有代码改动最小。

提醒:

脚本尽量不要在同一秒内多次操作crontab内容,否则可能导致crontab不生效的情况。

本文转载自:

偶素浅小浅
粉丝 8
博文 202
码字总数 0
作品 0
信阳
私信 提问
Android 列表(ListView、RecyclerView)不断刷新最佳实践

本文微信公众号「AndroidTraveler」首发。 背景 在 Android 列表开发过程中,有时候我们的 Item 会有一些组件,比如倒计时。这类组件要求不断刷新,这个时候由于列表复用的机制,因此会有一些...

安卓小煜
昨天
0
0
计划任务 at , crontab

一、at at now +1 minutes // 一份钟后启动 at> date >/opt/ok at> ctrl +d at 04pm +3 days //三天后的下午四点钟启动 at>date > /opt/ok at>ctrl + d 执行结果 atd at -l //列出at任务列表......

柳白子
2016/09/27
8
0
进程管理与计划任务

一、进程概念 内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、 安全功能等 Process: 运行中的程序的一个副本,是被载入内存的一个指令集合 进程ID (Process ID ,PID )号...

雾中花1
2017/09/17
0
0
JavaScript 函数防抖了解一下

说到防抖,想必多数人首先想到的是相机的防抖。因为我们并不是机器人,所以拿手机拍照的时候,手都会有不易察觉的抖动,这样的抖动会影响相片的质量。手机对这些情况做的一些补偿操作,减小了...

菲利普马洛
06/29
0
0
定时任务管理 at 和crontab

1 at 先安装at yum install at at now +3 minutes 其他一小时,一天,一年,内同,可以搜,这里就不多少。 atq 查看定时任务 at -d num 删除任务 ctrl + d 退出 2 crontab 在工作中更多的是c...

wzl_up
2016/09/26
25
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
42分钟前
4
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
7
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
10
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
14
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部