我知道如何在一个 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 运行时会失败的原因。