Chinaunix首页 | 论坛 | 博客
  • 博客访问: 405931
  • 博文数量: 65
  • 博客积分: 1491
  • 博客等级: 上尉
  • 技术积分: 702
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-30 15:57
文章分类
文章存档

2011年(6)

2010年(12)

2009年(47)

我的朋友

分类: LINUX

2009-05-30 16:40:16

之前自己设计了一条规则:0 */48 * * * cmd01,本意是每隔48小时执行一次cmd01.可是用户反映cmd01的执行不是每48小时,而是比这个频繁。(稍后会说明正确的写法应该是:0 0 */2 * * cmd01)

  上网找 cron 的语法,多是介绍正确的 cron 规则该怎么写并配有实例,却鲜有错误规则的介绍,因此无法肯定这条规则的错误出在那里。为了解决这个问题,不得已只好去看cron 模块的代码,还好代码比较少。下面是自己的总结:

目标规则:0 */48 * * * cmd01
具体分析:
  原来,cron 内部为每一条规则分配一个数据结构,如下:
    typedef struct CronLine {
      ...
      char cl_Mins[60]; /* 0-59 */
      char cl_Hrs[24]; /* 0-23 */
      char cl_Days[32]; /* 1-31 */
       char cl_Mons[12]; /* 0-11 */
      char cl_Dow[7]; /* 0-6, beginning sunday */
    }
  cron 在读取目标规则后,会调用一个函数去进行解析(这个解析函数见本文附件A),再用解析结果填充为其分配的数据结构,而这个数据结构代表着 cmd01 什么时候应该被执行。

  继续分析之前,有必要先把 cron 的工作机制说清楚。这里还是以目标规则为例。cron 是一个后台进程,每分钟执行一次。每次执行时调用系统当前时间去检查目标规则的各个时间分量,如果跟目标规则的所有时间分量都匹配成功,则执行目标规则的动作 cmd01. 否则 cron 不执行任何动作,并继续等待下一次检查。

  现在回到分析正文。目标规则中,‘0’是分钟分量。解析函数在解析‘0’时,将cl_Mins[0] 置为1.这和目标规则的本意一致,即如果当前系统时间的分钟分量是‘0’时,cron便去检查数组分量 cl_Mins[0] 是否为真,如果为真,则匹配成功。同样,如果这里的分钟分量不是‘0’,而是‘59’, 则 cron 便去检查数组分量 cl_Mins[59] 是否为真。

  解析‘*/48’时,cl_Hrs[0] 被置为1.这便是问题所在!因为我的本意是每48小时执行一次cmd01,而现在只有cl_Hrs[0]被置为1,这意味着只有系统时间的小时值为‘0’时才匹配小时分量成功。为什么会这样?因为依据前面的数据结构定义,小时分量只能保存 0-23 之间的数值,而如果要定义大于23的小时分量,必须进位到日期分量,而 cron 的解析函数并没有自动进位的功能,因此要求用户必须在设计规则时将目标规则设计为:
0 0 */2 * * cmd01
附件A:
  函数源代码连接为:
<--文章完-->
阅读(605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~