Почему мой демон 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
?
2 ответа
После долгих проб и ошибок я наткнулся на обходной путь. По какой-то причине 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
,
Смотреть на /proc/user_beancounters
более конкретно, на failcnt
колонка.
Для всех ненулевых записей вам нужно увеличить barrier
/limit
соответственно, это, вероятно, просто OpenVZ убивает ваши процессы за их попадание.
Вот описание каждого столбца: http://wiki.openvz.org/Proc/user_beancounters
Для подотчетных параметров удерживаемое поле показывает текущий счетчик для контейнера ("использование" ресурса), а поле maxheld показывает максимум счетчика за последний отчетный период. Отчетным периодом обычно является срок службы контейнера.
Поле failcnt показывает количество отклоненных "распределений ресурсов" за весь срок службы группы процессов.
Поля барьера и ограничения являются настройками управления ресурсами. Для некоторых параметров может использоваться только один, для некоторых параметров - оба. Эти поля могут указывать ограничения или гарантии, и их точное значение зависит от параметров. Описание каждого параметра в параметрах UBC содержит информацию о разнице между барьером и пределом для параметра.