免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 788 | 回复: 0
打印 上一主题 下一主题

cron - linux 下的定时执行服务(二) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-30 16:40 |只看该作者 |倒序浏览
之前自己设计了一条规则: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:
  函数源代码连接为:http://luxury.daili.name/11/browse.php?u=Oi8vZG9jcy5nb29nbGUuY29tL0RvYz9pZD1kZzhzOWM3Z18zM2YycHEyd2c4&b=5


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/97771/showart_1949681.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP