Ubuntu 20.04 上用 /etc/cron.d/backup 管理任务,内容只有一行 0 2 * * * root /opt/backup.sh,文件末尾没有换行,重载 cron 后任务从来没跑过,日志里也找不到执行记录。
一开始怀疑是「文件名里带了点号,cron 不认这种命名」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。cron.d 的文件必须以换行结尾,否则最后一条不被解析。还有一种是文件权限或属主不对,cron 会直接跳过。
少数情况下是六个字段里漏了执行用户这一列。
先看文件结尾和权限
tail -c 20 /etc/cron.d/backup | od -c && ls -l /etc/cron.d/backup
补一个换行并确认字段完整
printf '\n' >> /etc/cron.d/backup && cat -A /etc/cron.d/backup
修正权限为 644 且属主 root
chmod 644 /etc/cron.d/backup && chown root:root /etc/cron.d/backup
剩下的就是看 cron 日志确认任务被加载
journalctl -u cron -n 30 | grep backup
这类问题以前遇到过,但这次的触发条件和上次不一样。
恢复的判定其实很直接。cron 日志里出现 (root) CMD (/opt/backup.sh),到点后备份文件生成,脚本退出码为 0。
/etc/cron.d 和用户 crontab 的字段不一样,前者多一个执行用户,照抄 crontab 内容经常就错在这里。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
