![有时,crontab 不会由 cron 守护进程重新加载](https://linux22.com/image/710912/%E6%9C%89%E6%97%B6%EF%BC%8Ccrontab%20%E4%B8%8D%E4%BC%9A%E7%94%B1%20cron%20%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E9%87%8D%E6%96%B0%E5%8A%A0%E8%BD%BD.png)
我问这个问题,因为我在这里找不到答案:
为什么我的 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
具有预期的内容和修改日期:
$ 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
“偶尔”的意思是:没有规律,我们大概每个月看到一次这个错误,在正在运行的约 80 台服务器中的一台随机服务器上。
问题
有人知道该去哪里找吗?
答案1
首先,为了安全起见,我建议使用适当的方式处理crontab
。即
crontab -u user -r
删除他的 crontab,然后
crontab -u user backed_up_crontab_file
恢复。
其次,时间安排可能很重要。如果用户的 crontab 很少运行,那么它可能会在恢复后错过运行 1 次,因为它会在实际恢复前一分钟触发。