我有一个 cron 作业列表。
00 21 * * * sh ~/db_backup.sh
20 21 * * * sh ~/update.sh
* 5 1 * * sh ~/db_vacuum.sh
第一项工作是对我在 Ubuntu 服务器上运行的数据库进行备份,这有效,因为我使用以下命令验证了备份文件的最后修改日期:
date -r db.sql
我的第三个 cron 作业只是在每个月初清理我的数据库。我的问题出在我的第二个作业中。此作业在我正在运行的 DJango 应用程序上执行了几个 url 回调:
sudo docker exec -it web_1 wget -t 0 "http://127.0.0.1:8080/admin/command1"
sudo docker exec -it web_1 wget -t 0 "http://127.0.0.1:8080/admin/command2"
sudo docker exec -it web_1 wget -t 0 "http://127.0.0.1:8080/admin/command3"
sudo docker exec -it web_1 wget -t 0 "http://127.0.0.1:8080/admin/command4"
我检查了预期的输出,似乎文件根本没有执行,奇怪的是,如果我使用以下命令手动执行它:
sh ~/update.sh
它运行完美,我是否遗漏了 wgets 的某些功能?如果不太明显,wget 命令指向运行服务器的 docker 容器。
更新:
我尝试将日志文件作为输出文件附加到 .sh 文件中的 wget 命令。在设定的 cron 作业执行时间之后检查,目录中没有日志文件。
然后我检查了实际的系统日志,发现这条消息在我的.sh 文件执行后立即出现在日志中。
(CRON) info (No MTA installed, discarding output)
这可能有什么关联吗?
答案1
sudo
您的问题在于脚本中的使用。Cron 可以绝不输入您的 sudo 密码。
答案2
我注意到您使用 sh 来调用 cronjob,但是 sh 是 bash 的一个子集,可能无法执行您的 cronjob。此外,手动运行任务与通过 cron 运行任务并不一定相同。请在 cronjob 中将 sh 更改为 bash,看看会发生什么。
您在日志文件中看到的有关 MTA 的错误消息意味着您没有安装邮件传输代理,也就是说您没有安装发送邮件的软件。Cron 会尝试发送邮件来通知您某事。这可能是有关失败的 cronjob 的错误消息。