今天在遇到了一个“灵异”问题,无论我如何调试,被定制的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 --