有时,crontab 不会由 cron 守护进程重新加载

有时,crontab 不会由 cron 守护进程重新加载

我问这个问题,因为我在这里找不到答案:
为什么我的 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 次,因为它会在实际恢复前一分钟触发。

相关内容