Cron 每 15 分钟重试一次任务

Cron 每 15 分钟重试一次任务

我有一个 Amazon Linux AMI,它在 crontab 中有这个:

0 7 * * 1 root /usr/bin/wget -q http://localhost/digest_weekly.php -O - >> /var/log/digest_weekly.log

这会在每个星期一早上 7 点调用该脚本digest_weekly.php。此脚本从数据库收集一些数据并向每个用户发送电子邮件。它会返回所有已发送电子邮件的电子邮件地址的列表。今天它必须发送 2608 封电子邮件。该脚本需要一段时间才能执行,但我在日志中看不到超时错误。

问题是邮件每 15 分钟发送一次。/var/log/digest_weekly.log是空的,所以我猜想这项工作没有完成,并且 cron 在给它一些时间后以某种方式再次启动它。我在 Apache 访问日志中看到这一点:

127.0.0.1 - - [23/May/2016:07:00:01 +0000] "GET /digest_weekly.php HTTP/1.1" 200 70941 "-" "Wget/1.16.1 (linux-gnu)"
127.0.0.1 - - [23/May/2016:07:15:02 +0000] "GET /digest_weekly.php HTTP/1.1" 200 70941 "-" "Wget/1.16.1 (linux-gnu)"
127.0.0.1 - - [23/May/2016:07:30:04 +0000] "GET /digest_weekly.php HTTP/1.1" 200 70917 "-" "Wget/1.16.1 (linux-gnu)"

/var/log/cron我只能看到一行:

May 30 07:00:01 ip-172-31-8-62 CROND[8104]: (root) CMD (/usr/bin/wget -q http://localhost/digest_weekly.php -O - >> /var/log/synkratos/digest_weekly.log)

其他 cron 作业执行正常(每小时、每天)。

为什么这个 cron 作业会重复执行?上周它执行了 4 次,今天执行了 9 次(直到我终止了该任务)。

答案1

这不是一个 cron 问题,而是wget达到默认超时时间 900 秒后重新开始下载:

--read-timeout=seconds 将读取(和写入)超时设置为秒。此超时的“时间”指的是空闲时间:如果在下载的任何时间点,超过指定的秒数未收到任何数据,则读取失败并重新开始下载。此选项不会直接影响整个下载的持续时间。
当然,远程服务器可能会选择比此选项要求的更早终止连接。默认读取超时是900秒。

您不应该通过调用 Web 服务器来执行 PHP 脚本,而应该从命令行 PHP 解释器运行该脚本,例如:

0 7 * * 1 root /usr/bin/php /path/to/digest_weekly.php  >> /var/log/digest_weekly.log

答案2

你确定真的是 cron (至少是那行) 发送请求吗?最快的检查方法:注释掉那行,稍后再检查 cron 日志。

也许还有其他时间表。

相关内容