Cron 每 15 分钟重试一次作业

Mar*_*aró 0 cron amazon-ec2

我在 crontab 中有一个 Amazon Linux AMI:

0 7 * * 1 root /usr/bin/wget -q http://localhost/digest_weekly.php -O - >> /var/log/digest_weekly.log
Run Code Online (Sandbox Code Playgroud)

这会在digest_weekly.php每周一早上 7 点调用脚本。该脚本从数据库中收集一些数据并向每个用户发送一封电子邮件。它返回它发送电子邮件的所有电子邮件地址的列表。今天它必须发送 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)"
Run Code Online (Sandbox Code Playgroud)

但在/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)
Run Code Online (Sandbox Code Playgroud)

其他 cron 作业执行得很好(每小时、每天)。

为什么重复这个 cron 工作?上周执行了 4 次,今天执行了 9 次(直到我杀死了任务)。

HBr*_*ijn 6

这不是 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
Run Code Online (Sandbox Code Playgroud)