Назад | Перейти на главную страницу

Почему мой демон cron убивается каждые несколько минут?

Примерно неделю назад мой демон cron отказывается продолжать работу. Я использую Debian 6 x64 на виртуальной машине OpenVZ. Запуск чего-то вроде pgrep cron показывает, что демон не запущен. Я запускаю службу с service cron start или /etc/init.d/cron start и он запускается, но исчезает из списка запущенных процессов через несколько минут (варьируется от 1 до 30 минут до повторного завершения процесса).

С помощью strace -f service cron start, Я вижу, что процесс по какой-то причине убивается:

nanosleep({60, 0},  <unfinished ...>
+++ killed by SIGKILL +++

Нет ничего актуального в /var/log/syslog, /var/log/messages, /var/log/auth.log, или /var/log/kern.log чтобы объяснить, почему процесс умирает. В системе не менее 800 МБ свободной памяти, и cat /proc/loadavg возвращается 0.22 0.13 0.04 так что ресурсы не должны быть проблемой. С участием cron Бег, free -m отчеты:

             total       used       free     shared    buffers     cached
Mem:          1024        211        812          0          0          0
-/+ buffers/cache:        211        812
Swap:            0          0          0

Я также попытался удалить и переустановить cron пакет с использованием apt-get.

Обновить: Сначала я думал, что проблема в ресурсах. Я стер весь свой VPS и начал со свежего образа Debian. В настоящее время в системе больше ничего не работает, но даже после чистой установки мой демон cron все равно убивается случайным образом.

Что еще я должен проверить? Как мне узнать, что убивает мою crond?

смотреть на /proc/user_beancounters, а точнее, на failcnt столбец.

Для всех ненулевых записей вам необходимо увеличить barrier/limit соответственно, это, вероятно, просто OpenVZ, убивающий ваши процессы за их попадание.

Вот описание каждого столбца: http://wiki.openvz.org/Proc/user_beancounters

Для подотчетных параметров в удерживаемом поле отображается текущий счетчик для контейнера («использование» ресурса), а в поле maxheld отображается максимум счетчика за последний отчетный период. Отчетным периодом обычно является срок службы контейнера.

Поле failcnt показывает количество отклоненных «выделений ресурсов» за все время существования группы процессов.

Поля барьера и ограничения являются настройками управления ресурсами. Для некоторых параметров можно использовать только один из них, для некоторых параметров - оба. Эти поля могут указывать ограничения или гарантии, и их точное значение зависит от параметра. Описание каждого параметра в параметрах UBC содержит информацию о разнице между барьером и пределом для параметра.

После долгих проб и ошибок я нашел обходной путь. По какой-то причине cron убивается (предположительно хостом) только в том случае, если он работает в режиме демона. Если запускается с cron -f, процесс продолжается. Итак, я создал простой скрипт, чтобы запустить его на переднем плане (и постоянно перезапускать его в маловероятном случае, если он действительно погибнет):

#!/bin/bash -u
while [ 1 ]; do
        logger -i -t cronrestart -p cron.warn "Launching cron daemon"
        cron -f
        logger -i -t cronrestart -p cron.warn "Cron daemon killed"
done
logger -i -t cronrestart -p cron.warn "Quitting"

Затем я запускаю этот сценарий запуска через nohup cronrestart >/dev/null & поэтому он работает в фоновом режиме. Cron уже неделю работает таким образом, ни разу не погиб.

Полагаю, следующим шагом будет попробуйте запустить сценарий запуска в фоновом режиме чтобы лучше имитировать режим демона cron.