Crontab 执行多个命令但省略最后一个命令

Crontab 执行多个命令但省略最后一个命令

我知道如何在一个 crontab 行中执行多个命令,但我不明白为什么我的最后一个命令没有被执行。我的 (root) crontab 就像

5 0 1,15 * * echo $(date) >> /root/certbot_cronjob_log.txt && /usr/services/certbot/certbot-auto renew --text >>/root/certbot_cronjob_log.txt 2>&1 && service nginx restart

我想要实现的目标:将当前日期写入文件 certbot_cronjob_log.txt,然后运行自动更新脚本“certbot-auto”,将其输出写入文件,然后重新启动 nginx。

它会执行所有操作,直到“重新启动 nginx”。当我在终端中(以 root 身份)运行整个命令时,它会正常工作并且 nginx 会重新启动。

我已经尝试过这个:

5 0 1,15 * * bash -c 'echo $(date) >> /root/certbot_cronjob_log.txt && /usr/services/certbot/certbot-auto renew --text >>/root/certbot_cronjob_log.txt 2>&1 && service nginx restart' 

有任何想法吗?

答案1

/usr/sbin目录(upstartservice命令所在的目录)不在默认的 crontab 路径中,因此您需要PATH在 crontab 文件顶部添加明确的分配,例如:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

或者在命令中使用完整路径

/usr/sbin/service nginx restart

无论您将其保留为内联命令还是将其分解为 shell 脚本,您都需要执行此操作(尽管您可以选择PATH在脚本中而不是在 crontab 文件中进行设置)。


由于这个问题的变体经常被问到,因此这里是我 16.04 系统上的默认 cron 环境,通过/usr/bin/printenv > /tmp/cronenv从 root 的 crontab 运行获得:

LANGUAGE=en_CA:en
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/root

请注意它是多么的简单 —— 这通常是为什么在交互式 shell 中运行良好的命令或脚本在从 cron 运行时会失败的原因。

相关内容