У меня есть AMI Amazon Linux с этим в crontab:
0 7 * * 1 root /usr/bin/wget -q http://localhost/digest_weekly.php -O - >> /var/log/digest_weekly.log
Это вызывает сценарий 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)"
Но в /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 (пока я не убил задачу).
Это не проблема cron, скорее wget
перезапуск загрузки после достижения тайм-аута по умолчанию 900 секунд:
--read-timeout=seconds
Установите таймаут чтения (и записи) на секунды секунды. «Время» этого тайм-аута относится к времени простоя: если в какой-либо момент загрузки данные не принимаются в течение более указанного количества секунд, чтение завершается ошибкой и загрузка возобновляется. Этот параметр не влияет напрямую на продолжительность всей загрузки.
Конечно, удаленный сервер может решить прервать соединение раньше, чем этого требует эта опция. В таймаут чтения по умолчанию900
секунд.
Вместо того, чтобы выполнять свой PHP-скрипт путем вызова веб-сервера, вам, вероятно, следует запустить скрипт из интерпретатора PHP в командной строке, то есть что-то вроде:
0 7 * * 1 root /usr/bin/php /path/to/digest_weekly.php >> /var/log/digest_weekly.log
Вы уверены, что это действительно cron (по крайней мере, эта строка) отправляет запросы? Самый быстрый способ проверить: закомментировать эту строку и позже проверить журналы cron.
Возможно, есть другой график.