Я запускаю кучу заданий cron (настроил с помощью sudo crontab -e
) на Ubuntu, а в последнее время (хотя я не знаю, когда быть уверенным) я внезапно вижу, что одни и те же задания выполняются несколько раз за одну минуту. Вам не нужно видеть полный crontab, чтобы поверить мне, что они абсолютно не указаны дважды. Но для вкуса вот фрагмент:
*/2 * * * * /usr/bin/wget --no-check-certificate 'https://myserver.net/someuri/pdm/33?embed_in_page=xyz'
* * * * * /usr/bin/wget --no-check-certificate 'https://myserver.net/someuri/pdm/77'
* * * * * /usr/bin/wget --no-check-certificate 'https://myserver.net/someuri/pdm/20?blah=blah'
* * * * * echo "`date` Running now" >> /home/somewhere/croncheck
Я также добавил это простое эхо в конец, которое запускается каждую минуту, и оно никогда не запускается более одного раза.
Итак, что касается эха, я вижу, что это происходит только раз в минуту. Но периодически, особенно под нагрузкой, сервер, кажется, несколько раз подряд запускает URL-запросы wget (по журналу веб-сервера я знаю, что они приходят из одного места примерно в одно и то же время).
Если я сбегу ps -A |grep cron
Я увижу дюжину или больше записей вроде:
28055 ? 00:00:00 cron
Они вроде не уходят.
Если я сбегу ps aux
то я вижу только одну запись, как я и ожидал.
Итак, я предполагаю, что существует неприятное взаимодействие между wget и cron, и, возможно, что-то не так (хотя сервер и интерактивные вызовы того же веб-сервера через веб-браузер кажутся в значительной степени неизменными, просто замедляются из-за ненужных работай). Но на самом деле я не знаю. Я ищу любые идеи, которые могут у вас возникнуть, относительно причины и возможных решений проблемы.
Хотя я не совсем уверен, почему это происходит, похоже, что длительные задания внутри cron вызывают странное поведение. В исходном посте есть ряд заданий, которые запускаются каждые пять минут, а некоторые - через одну минуту друг за другом. Если первое задание занимает слишком много времени (например, 10 минут), я предполагаю, что разветвленный процесс первого задания длится десять минут и запускает последующие задания в списке. Но основной процесс cron также правильно запускает эти задания, поэтому возникают дубликаты, и все проблемы каскадируются.
Хватит догадок. Чтобы исправить это, вот фрагмент моего нового crontab, использующего flock
чтобы заблокировать последующие задания, которые могут выполняться неправильно.
# every 5 minutes
*/5 * * * * flock -w 2000 /tmp/cnsd.lockfile.pdm -c "/usr/bin/longrunningjob1"
# every 5 minutes
*/5 * * * * flock -w 2000 /tmp/cnsd.lockfile.pdm -c "/usr/bin/longrunningjob2"
# every 15 minutes past the hour
15 * * * * flock -w 2000 /tmp/cnsd.lockfile.pdm -c "/usr/bin/longrunningjob3"
По крайней мере, таким образом, когда система перегружена, это не вызывает каскад заданий, которые никогда не должны были запускаться, а вместо этого дает всему шанс восстановиться. Я играл с разными классами заданий, используя разные файлы блокировки, но в моем случае у меня были только ограниченные ресурсы, поэтому организация очереди друг за другом была лучшим способом поддерживать работу системы.
Убедитесь, что в веб-журналах несколько раз отображается одна и та же запись. Если это так, убедитесь, что они находятся в одно и то же время. Cron НЕ является абсолютным и, как было сказано, иногда система облагается налогом. Cron будет «пытаться» запустить задания в указанное время, но это не обязательно, и иногда задание будет выполняться позже, чем ожидалось, и это может быть во время того же задания, и тогда вы увидите две записи.
Другая проблема может быть в том, что задание занимает больше времени, чем ожидалось, и все еще выполняется при запуске следующей итерации. Я бы начал с исключения. Закомментируйте все, кроме одного, и дайте ему запустить и контролировать, затем добавьте следующий, следующий и т. Д., Чтобы увидеть, что произойдет.