我在问这个问题,因为我在这里找不到答案:
为什么我的crontab无法正常工作,我该如何排除故障?
上下文
我们有几个运行debian / wheezy的服务器。
一个备份任务要求我们在备份过程中停用特定用户的crontab,所以我们有一个脚本,每天运行一次,这个脚本大致是这样的:
# user is legec : # save the crontab to a file crontab -ulegec -l > /home/legec/.backup/crontab # empty the crontab echo "" | crontab -ulegec backup ... # reload crontab cat /home/legec/.backup/crontab | crontab -ulegec
而且这个工作正如我们所期望的,绝大多数时候都是这样
该任务在〜80台服务器上运行; 取决于服务器,备份任务将需要1分钟到2小时。
窃听器
偶尔,cron将不会检测到最后一次重新加载,并且不会执行crontab中列出的任何作业。
/var/spool/cron/crontabs/legec具有预期的内容,修改date:
$ ls -lh /var/spool/cron/crontabs/legec -rw------- 1 legec crontab 6.7K Sep 22 04:03 /var/spool/cron/crontabs/legec
但cron日志表明,cron没有检测到最后一次更改:
$ cat /var/log/cron.log | grep -E "LIST|RELOAD|REPLACE" ... # yesterday's backup : all went fine Sep 21 04:00:06 lgserver crontab[6670]: (root) LIST (legec) Sep 21 04:00:06 lgserver crontab[6671]: (root) LIST (legec) Sep 21 04:00:06 lgserver crontab[6673]: (root) REPLACE (legec) Sep 21 04:01:01 lgserver /usr/sbin/cron[2025]: (legec) RELOAD (crontabs/legec) Sep 21 04:03:01 lgserver crontab[7071]: (root) REPLACE (legec) Sep 21 04:03:01 lgserver /usr/sbin/cron[2025]: (legec) RELOAD (crontabs/legec) # today's backup : no final RELOAD event Sep 22 04:00:07 lgserver crontab[24163]: (root) LIST (legec) Sep 22 04:00:07 lgserver crontab[24164]: (root) LIST (legec) Sep 22 04:00:07 lgserver crontab[24166]: (root) REPLACE (legec) Sep 22 04:01:01 lgserver /usr/sbin/cron[2025]: (legec) RELOAD (crontabs/legec) Sep 22 04:03:01 lgserver crontab[24458]: (root) REPLACE (legec) # no RELOAD line here
“曾经有一段时间”的意思是:没有规律性,我们每个月都会看到这个bug,一个正在运行的〜80个随机服务器上。
题
有没有人在哪里看铅?
首先,为了安全起见,我build议使用适当的forms处理crontab 。 亦即
crontab -u user -r
删除他的crontab,并且
crontab -u user backed_up_crontab_file
恢复。
其次,你的时间可能是重要的。 如果用户的crontab很less运行,也许在恢复之后运行1次就会失败,因为在实际恢复之前它会启动一分钟。