Автоматический перезапуск демона 19.03.2013

Пока проверяется файловая система на моем сервере, я решил написать короткую заметку о том, как автоматически перезапускать демон на под линуксом.

Метод крайне топорный, но работает.

Два ограничения:

  • Максимальное время простоя - 1 минута. Т.е., в худшем случае, демон будет зависший/отключенный/etc в течение минуты.
  • Вы должны знать команду, которая в случае работы демона вернет какую-либо строку, а если нужен перезапуск - не вернет.

Я использую этот метод для автоматического перезапуска отваливающегося winbind'а и уходящего в астрал 1С сервера под Linux.

Важное замечание! Прежде чем использовать этот топорный или какой-то другой прекрасный метод перезапуска демона, попробуйте сделать так, чтобы перезапуска не требовалось вообще (это я для случая, когда демона выбивает) - почитайте логи, погуглите и решите проблему в корне.

С теорией все, займемся практикой.

Метод, который я использую, заключается в ежеминутном запуске скрипта, который проверяет наличие демона и, если его нет, перезапускает службу.

Создаем файл /usr/local/sbin/mydaemon.check (для winbind):

/usr/bin/wbinfo -u | grep -q v.shokov || /etc/init.d/winbind restart > /dev/null

Здесь команда /usr/bin/wbinfo -u | grep -q v.shokov запрашивает в домене всех пользователей, проверяет - есть ли там пользователь v.shokov (считаем, что он есть всегда) и, если возвращается пустая строка, то winbind перезапускается.

Можно сделать проверку на существование процесса - /bin/ps -A | grep -q winbind или, например, статус службы - /etc/init.d/winbind status | grep -q winbindd.

Важно лишь, чтобы команда как можно меньше грузила систему и, если служба нуждается в перезапуске, - возвращала пустую строку, а если не нуждается - то возвращала хоть что-то.

Теперь добавляем задание в /etc/crontab

* * * * * /usr/local/sbin/mydaemon.check

И перезапускаем cron. Собственно, все.