Примерно неделю назад мой демон 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
.