【crontab】告诉你一个小秘密:我“偶尔”只认“硬件时钟”!

今天在遇到了一个“灵异”问题,无论我如何调试,被定制的crontab定时任务就是不在我“指定的时间”运行。

发生该问题的操作系统是RHEL5.1。
[root@secDB ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.1 (Tikanga)

重新演绎一下这个过程。

1.编写一个简单的脚本test_crontab.sh
1)创建测试目录
[root@secDB ~]# mkdir test_crontab
[root@secDB ~]# cd test_crontab/

2)脚本内容仅包含一个输出时间的命令
[root@secDB test_crontab]# cat test_crontab.sh
date >> /root/test_crontab/test_crontab.out

3)赋予执行权限
[root@secDB test_crontab]# chmod u+x test_crontab.sh

2.定制crontab内容
[root@secDB test_crontab]# crontab -l
* * * * * /root/test_crontab/test_crontab.sh 1>/dev/null 2>&1

这里我们定制该脚本每分钟执行一次。

[root@secDB test_crontab]# cat test_crontab.out
Sat Jun  5 23:07:01 CST 2010
Sat Jun  5 23:08:01 CST 2010
Sat Jun  5 23:09:01 CST 2010
Sat Jun  5 23:10:02 CST 2010

从输出文件内容上看,脚本执行的既稳定又正常。

3.“灵异事件”出现
我们按照“date”命令显示的“系统时间”来调整该脚本。
[root@secDB test_crontab]# date
Sat Jun  5 23:22:33 CST 2010

[root@secDB test_crontab]# crontab -l
* 23 * * * /root/test_crontab/test_crontab.sh 1>/dev/null 2>&1

按照这样的调整,按道理该脚本还会每分钟运行一次。
但是我没等到该脚本继续输出。

4.原因分析
因为系统具有两个时钟,一个是硬件时钟,一个是系统时钟。同时查询这个两个时钟方法如下。
[root@secDB test_crontab]# hwclock -r ; date
Sat 05 Jun 2010 07:36:29 PM CST  -0.042570 seconds
Sat Jun  5 23:20:39 CST 2010

可见此时这两个时钟有很大的出入。
此时如果将crontab内容调整为如下以“硬件时间”为准的形式便可以正常工作。
[root@secDB test_crontab]# crontab -l
* 19 * * * /root/test_crontab/test_crontab.sh 1>/dev/null 2>&1

5.处理方法
为了防止混乱,我们可以使用“hwclock --systohc”命令将“硬件时钟”以“系统时钟”为参照进行调整。
[root@secDB test_crontab]# hwclock --systohc
[root@secDB test_crontab]# hwclock -r ; date
Sat 05 Jun 2010 11:45:25 PM CST  -0.940575 seconds
Sat Jun  5 23:45:24 CST 2010

调整之后,该问题得到有效的调整。

有时也会因为对crontab的时间格式理解不够透彻导致脚本不能正常运行,将其对应关系附于此,供参考。
.---------------- minute (0 - 59)
|   .------------- hour (0 - 23)
|   |   .---------- day of month (1 - 31)
|   |   |   .------- month (1 - 12) OR jan,feb,mar,apr ...
|   |   |   |  .----- day of week (0 - 7) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
|   |   |   |  |
*   *   *   *  *  command to be executed

6.小结
之所以说该问题是【我“偶尔”只认“硬件时钟”!】,是因为在多数情况下不会遇到该问题。很幸运与其邂逅,又纠缠不清。
这个问题提醒我们的是:调整系统时钟的同时请记住顺便对硬件时钟进行调整,保证二者的一致性。

Good luck.

secooler
10.06.05

-- The End --

请使用浏览器的分享功能分享到微信等