На одном из серверов столкнулся с такой проблемой, что периодически в совершенно случайное время останавливается DNS сервер BIND, и соответственно перестаёт работать домен, о чём я узнаю по SMS-сообщению от сервиса Яндекс Метрика, приходилось по SSH подключаться к серверу и перезапускать сервер, благо сейчас есть телефоны с Android и различные SSH терминалы, попробовав разные я остановил свой выбор на Juice SSH, просто больше всего нравится.
Чтобы избежать таких неприятностей, было принято решение написать bash скрипт который раз в минуту будет проверять запущена ли служба или нет, если нет, то запускать её и отправлять уведомление о событии по почте.
Так как есть вероятность, что сервер не стартанёт, то скрипт после запуска повторно проверяет запущенность службы и если видит что служба не работает, отправляет сообщение с просьбой человека вмешаться. Эта часть скрипта, как мне кажется совсем коряво, сделана, но работает, если кто-то предложит более красивое решение, буду благодарен.
Итак начнём, все просто давольно таки ниже код скрипта с комментариями
#### Не забываем указать к какому интерпретатору скрипту необходимо обращаться
#! /bin/bash
if [ -e /var/run/named/named.pid ] #так как при запуске службы создаётся файл процесса,
# то мы просто проверяем есть ли он на месте или нет, ключ -e говорит скрипту проверить
# существует ли файл /var/run/named/named.pid
then
exit # файл есть, выходим из скрипта
else
/etc/init.d/bind9 start > /dev/null && /root/./send_notice > /dev/null # если файла нет, то стартуем
# его заново и отправляем уведомление по почте (см. содержание ниже)
fi # Указываем обязательно!!! Иначе скрипт не выполнится
if [ -e /var/run/named/named.pid ] # проверяем повторно, если всё Ок, то выходим
then
exit
else
/root/./send_alarm >> /dev/null # если нет, то отправляем сообщение с просьбой вмешаться.
fi
exit 0 # прекращаем выполнение скрипта
Делаем скрипт исполняемым
~#: chmod +x script_name
Уведомление:
#! /bin/bash
FROM="From: "
TO="To:"
SUBJECT="Subject: Bind crash"
BODY="Обнаружено падение BIND9, но всё хорошо, служба перзапущена"
BODY1="Время события: $(date -R)"
echo $FROM >> message.tmp
echo $TO >> message.tmp
echo $SUBJECT >> message.tmp
echo $BODY >> message.tmp
echo $BODY1 >> message.tmp
/usr/sbin/sendmail -t < message.tmp
rm message.tmp
Тревога:
#! /bin/bash
FROM="From: "
TO="To: "
SUBJECT="Subject: !!! Bind troubles"
BODY="ВНИМАНИЕ скрипт не смог перезапустить BIND требуется вмешательство"
BODY1="Время события: $(date -R)"
echo $FROM >> message.tmp
echo $TO >> message.tmp
echo $SUBJECT >> message.tmp
echo $BODY >> message.tmp
echo $BODY1 >> message.tmp
/usr/sbin/sendmail -t < message.tmp
rm message.tmp
Это скрипт с комментариями я описывал ранее
Не забываем сделать эти оба скрипта исполняемыми.
Теперь добавим скрипт в cron
~#: crontab -e
И вносим запись
0-59 * * * * /путь_к_скрипту
Здесь мы указываем, что выполнять скрипт нужно каждую минуту.
Вот и всё, теперь BIND будет перезапускаться при каждом "чихе"