我在 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 次(直到我杀死了任务)。
这不是 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)
归档时间: |
|
查看次数: |
1265 次 |
最近记录: |