Случается, что какой-то процесс время от времени вылетает, что не есть хорошо. И выяснить причину падений не всегда удается. Как вариант - установка мониторинговой системы (Monit [1], Zabbix, Nagios [2], etc). Однако не всегда в этом есть смысл, особенно когда это сервер небольшого офиса. В этом случае работу сервиса проще проверять простеньким скриптом, который проверяет, запущен ли процесс, а если нет - дает команду на запуск сервиса.
Отработаем на реальной ситуации... Знакомый пожаловался, что время от времени перестает работать телефония, и он перезапускает asterisk, согласно инструкции данной админом. Как оказалось, asterisk рендомно по времени и молча "падал". Разбираться с причинами падений не было ни времени, ни заинтересованости, поэтому и пригодился даный скрипт.
#!/bin/sh
# Название процесса DAEMON="asterisk" # "Убираем" grep из вывода EXCLUDE="grep" # Минимальное количество процессов PROC_NUM="0" # Команда для перезапуска RESTART="/bin/sh /usr/local/etc/rc.d/asterisk restart" # Утилита ps PS="/bin/ps" # Утилита grep GREP="/usr/bin/grep"
if [ `$PS -ax | $GREP $DAEMON | $GREP -v $EXCLUDE | wc -l` -le "$PROC_NUM" ]
then
$RESTART
fi |
Добавим запуск скрипта (в моем случае я его сохранил как /usr/local/etc/check.sh) в cron с интервалом проверки каждую минуту:
# echo '# Daemon check' >> /etc/crontab # echo '* * * * * root /bin/sh /usr/local/etc/check.sh' >> /etc/crontab |
Выполним проверку работы скрипта. Остановим процесс asterisk и по прошествии минуты, проверим его наличие в процессах:
18:00 # sh /usr/local/etc/rc.d/asterisk stop Stopping asterisk 18:01 # ps -ax | grep asterisk | grep -v grep 28756 ?? Ss 0:03,54 /usr/local/sbin/asterisk -n -U asterisk |