Sudo crontab 未执行

Sudo crontab 未执行

我正在运行 Ubuntu 20.04,并且设置了 sudo crontab,但这些行似乎没有执行(例如,我的备份脚本应该在完成后给我发送电子邮件,但它从来没有这样做过,而且它的日志显示它没有运行)。我的 crontab ( sudo crontab -e) 如下所示:

0 8 * * * /usr/local/bin/cloudflare-ddns-update.sh
0 5 * * * /usr/local/bin/duplicacy-util -sd /home/rooday/.duplicacy-util -f mediabackup -a -m -q && curl -fsS --retry 5 -o /dev/null https://hc-ping.com/[removed the uuid for this post]

如果检查 journalctl 我会看到今天的这个(仅显示相关日志):

➜  ~ sudo journalctl -u cron.service
...
Jan 04 05:00:01 engager CRON[856196]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 04 05:00:01 engager CRON[856197]: (root) CMD (/usr/local/bin/duplicacy-util -sd /home/rooday/.duplicacy-util -f mediabackup -a -m -q && curl -fsS --retry 5 -o /dev/null https://hc-ping.com/[removed the uuid for this post])
Jan 04 05:00:01 engager CRON[856196]: pam_unix(cron:session): session closed for user root
...
Jan 04 08:00:01 engager CRON[883807]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 04 08:00:01 engager CRON[883808]: (root) CMD (/usr/local/bin/cloudflare-ddns-update.sh)
Jan 04 08:00:11 engager CRON[883807]: pam_unix(cron:session): session closed for user root
...

这是可疑的,因为会话只开放了很短的时间(假设 DNS 记录的更新可以在 10 秒内完成,但备份脚本不可能在一秒内完成)。

此外,如果我 grep syslog,我会得到这个(与我的备份或 DNS 更新无关):

➜  ~ cat /var/log/syslog | grep cron
Jan  4 00:17:01 engager CRON[812711]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 01:17:01 engager CRON[822094]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 01:32:02 engager CRON[824329]: (root) CMD (   test -x /etc/cron.daily/popularity-contest && /etc/cron.daily/popularity-contest --crond)
Jan  4 02:17:01 engager CRON[831325]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 03:17:01 engager CRON[840396]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 04:17:01 engager CRON[849724]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 05:17:01 engager CRON[858774]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 06:17:01 engager CRON[867977]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 06:25:01 engager CRON[869210]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
Jan  4 07:17:01 engager CRON[877115]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 07:30:01 engager CRON[879085]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi)
Jan  4 07:34:00 engager systemd[1]: Started Run anacron jobs.
Jan  4 07:34:00 engager anacron[879690]: Anacron 2.3 started on 2021-01-04
Jan  4 07:34:00 engager anacron[879690]: Will run job `cron.daily' in 5 min.
Jan  4 07:34:00 engager anacron[879690]: Will run job `cron.weekly' in 10 min.
Jan  4 07:34:00 engager anacron[879690]: Jobs will be executed sequentially
Jan  4 07:39:00 engager anacron[879690]: Job `cron.daily' started
Jan  4 07:39:00 engager anacron[880491]: Updated timestamp for job `cron.daily' to 2021-01-04
Jan  4 07:39:02 engager anacron[879690]: Job `cron.daily' terminated
Jan  4 07:44:00 engager anacron[879690]: Job `cron.weekly' started
Jan  4 07:44:00 engager anacron[881356]: Updated timestamp for job `cron.weekly' to 2021-01-04
Jan  4 07:44:00 engager anacron[879690]: Job `cron.weekly' terminated
Jan  4 07:44:00 engager anacron[879690]: Normal exit (2 jobs run)
Jan  4 07:44:00 engager systemd[1]: anacron.service: Succeeded.
Jan  4 08:17:01 engager CRON[886527]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 08:30:01 engager CRON[888487]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi)
Jan  4 08:34:50 engager systemd[1]: Started Run anacron jobs.
Jan  4 08:34:50 engager anacron[889199]: Anacron 2.3 started on 2021-01-04
Jan  4 08:34:50 engager anacron[889199]: Normal exit (0 jobs run)
Jan  4 08:34:50 engager systemd[1]: anacron.service: Succeeded.
Jan  4 09:17:01 engager CRON[895646]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  4 09:30:01 engager CRON[897615]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi)
Jan  4 09:34:20 engager systemd[1]: Started Run anacron jobs.
Jan  4 09:34:20 engager anacron[898342]: Anacron 2.3 started on 2021-01-04
Jan  4 09:34:20 engager anacron[898342]: Normal exit (0 jobs run)
Jan  4 09:34:20 engager systemd[1]: anacron.service: Succeeded.
Jan  4 10:17:01 engager CRON[905160]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

我甚至设置了 Postfix,以便在 cronjobs 之后收到电子邮件(不再出现没有 MTA 的警告),但我也没有收到那些电子邮件。如果我手动发送测试电子邮件,或手动运行 crontab 中的任何命令,一切都会正常。但它们不会自动运行,所以我是不是遗漏了什么?

编辑:在浏览了其他一些帖子后,我去检查了实际的 crontab 本身,我认为问题在于 root 的用户 crontab 没有运行。因为/etc/crontab包括以下内容:

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

似乎运行良好,但我编辑的 crontab 最终出现/var/spool/cron/crontabs/root。这可能是 cron 没有抓取该文件的问题吗?

答案1

我觉得自己很蠢,但真正的问题是 crontab 末尾没有换行符。我看到它/etc/crontab以只有 的一行结尾#,所以我将其复制到我的 crontab 中,瞧,它成功了!然而,令人恼火的是,这样的错误没有被自动捕获,而是默默地失败了(日志表现得好像命令正在运行)。我以为通过编辑 crontabsudo crontab -e会在退出时验证,但显然不是。

相关内容