Возникла необходимость в небольшом легком sh-скрипте, который бы с определенной периодичностью проверял, запущены ли сервисы на VPS. В частности, меня интересовала база данных MySQL, однако, если бы мониторились таким же образом и apache, nginx, ssh и тп, для меня это было бы также неплохо. Понятно, что можно использовать громоздкие системы мониторинга, однако, меня вполне устраивают Ajenti + Munin, которые я уже ставил на свой сервер, однако, они настолько простые, что конретно этого (вроде?) не умеют…
На просторах интернета, конечно, были найдены предложения подобной функциональности, однако, что-то меня во всех не устроило, так что на основании найденного написал свой ремикс Ну и естественно, выкладываю на всеобщее рассмотрение, может, кому еще понадобится, а кто-то, возможно, укажет на ошибки или предложит улучшение
Спойлер
[code=php]#!/bin/bash
################################################################################################ # Проверка статуса apache, nginx, mysql, ssh и перезагрузка сервисов при необходимости ################################################################################################
# Команда для отправки почты MAILCMD="$(which mail)" # Файл письма MAILMESSAGE="/tmp/vps_service.fail.$$" # Email, куда слать уведомления EMAILID="mylo@gmail.com"
# Функция для отправки письма mail_doxer() { $MAILCMD -s "Уведомление о проблемах на VPS-сервере $(hostname)" $EMAILID < $MAILMESSAGE }
echo "Данное письмо отправлено Вам, так как были обнаружены проблемы">>$MAILMESSAGE echo "на сервере $(hostname), а Ваш адрес указан в скрипте для таких уведомлений">>$MAILMESSAGE echo "----------------------------------------------------------------------------------------------------" >>$MAILMESSAGE echo "">>$MAILMESSAGE
if [ $ApacheThread -eq 0 ]; then echo "ОШИБКА:">>$MAILMESSAGE echo "-- При проверке обнаружено, что веб-сервер Apache не был запущен!">>$MAILMESSAGE echo "-- Произведена попытка запуска в $(date +"%d.%m.%y %H:%M:%S")...">>$MAILMESSAGE # Пытаемся запустить сервис /etc/init.d/apache2 start # "Вздремнем" на секундочку (так, на всякий пожарный) sleep 1 # Проверяем, работает ли сервис после выполнения скрипта echo "ТЕКУЩИЙ СТАТУС:" >>$MAILMESSAGE ApacheThreadAfter=`ps -A|grep apache2|wc -l` if [ $ApacheThreadAfter -eq 0 ]; then echo "-- Apache сейчас НЕ ЗАПУЩЕН!" >>$MAILMESSAGE echo "">>$MAILMESSAGE else echo "-- Apache сейчас запущен..." >>$MAILMESSAGE echo "">>$MAILMESSAGE fi fi
# # Проверяем, запущен ли nginx #
if [ $NginxThread -eq 0 ]; then echo "ОШИБКА:">>$MAILMESSAGE echo "-- При проверке обнаружено, что веб-сервер Nginx не был запущен!">>$MAILMESSAGE echo "-- Произведена попытка запуска в $(date +"%d.%m.%y %H:%M:%S")...">>$MAILMESSAGE # Пытаемся запустить сервис /etc/init.d/nginx start # "Вздремнем" на секундочку (так, на всякий пожарный) sleep 1 # Проверяем, работает ли сервис после выполнения скрипта echo "ТЕКУЩИЙ СТАТУС:" >>$MAILMESSAGE NginxThreadAfter=`ps -A|grep nginx|wc -l` if [ $NginxThreadAfter -eq 0 ]; then echo "-- Nginx сейчас НЕ ЗАПУЩЕН!" >>$MAILMESSAGE echo "">>$MAILMESSAGE else echo "-- Nginx сейчас запущен..." >>$MAILMESSAGE echo "">>$MAILMESSAGE fi fi
# # Проверяем, запущен ли mysql #
if [ $MysqldThread -eq 0 ]; then echo "ОШИБКА:">>$MAILMESSAGE echo "-- При проверке обнаружено, что MySQL-сервер не был запущен!">>$MAILMESSAGE echo "-- Произведена попытка запуска в $(date +"%d.%m.%y %H:%M:%S")...">>$MAILMESSAGE # Пытаемся запустить сервис /etc/init.d/mysql start # "Вздремнем" на секундочку (так, на всякий пожарный) sleep 1 # Проверяем, работает ли сервис после выполнения скрипта echo "ТЕКУЩИЙ СТАТУС:" >>$MAILMESSAGE MysqldThreadAfter=`ps -A|grep mysql|wc -l` if [ $MysqldThreadAfter -eq 0 ]; then echo "-- MySQL-сервер сейчас НЕ ЗАПУЩЕН!" >>$MAILMESSAGE echo "">>$MAILMESSAGE else echo "-- MySQL-сервер сейчас запущен..." >>$MAILMESSAGE echo "">>$MAILMESSAGE fi fi
# # Проверяем, запущен ли ssh-сервер #
if [ $SSHThread -eq 0 ]; then echo "ОШИБКА:">>$MAILMESSAGE echo "-- При проверке обнаружено, что SSH не был запущен!">>$MAILMESSAGE echo "-- Произведена попытка запуска в $(date +"%d.%m.%y %H:%M:%S")...">>$MAILMESSAGE # Пытаемся запустить сервис /etc/init.d/ssh start # "Вздремнем" на секундочку (так, на всякий пожарный) sleep 1 # Проверяем, работает ли сервис после выполнения скрипта echo "ТЕКУЩИЙ СТАТУС:" >>$MAILMESSAGE SSHThreadAfter=`ps -A|grep ssh|wc -l` if [ $SSHThreadAfter -eq 0 ]; then echo "-- SSH сейчас НЕ ЗАПУЩЕН!" >>$MAILMESSAGE echo "">>$MAILMESSAGE else echo "-- SSH сейчас запущен..." >>$MAILMESSAGE echo "">>$MAILMESSAGE fi fi
# Получаем текущее значение LA LOAD=`uptime | grep -o 'load average.*' | cut -c 15-18`
# Если оно больше указанного ниже значения, то это также повод для беспокойства if [ $LOAD \> 15.0 ]; then echo "ВНИМАНИЕ!!! Слишком большая нагрузка!" >>$MAILMESSAGE echo "-- Текущий Load Average: $LOAD " >>$MAILMESSAGE else echo "-- Текущий Load Average: $LOAD " >>$MAILMESSAGE fi
echo "----------------------------------------------------------------------------------------------------" >>$MAILMESSAGE echo "*** Это письмо сгенерировано скриптом $(basename $0) ***" >>$MAILMESSAGE echo "*** Не стоит отвечать на это письмо, это всего лишь уведомление ***" >>$MAILMESSAGE
# Проверяем, был ли нерабочим хоть один из проверяемых сервисов, если да, то шлем емэйл if [ $ApacheThread -eq 0 ] || [ $NginxThread -eq 0 ] || [ $MysqldThread -eq 0 ] || [ $SSHThread -eq 0 ] || [ $LOAD \> 15.0 ]; then mail_doxer fi
# "Вздремнем" на секундочку (так, на всякий пожарный) sleep 1
#Удаляем временный файл письма rm -f $MAILMESSAGE[/code]
Собственно скрипт сохраняем в любое место, присваиваем ему права доступа на исполнение (755) и можно повесить в cron для того, чтобы он периодически проверял, запущены ли необходимые сервисы (по образу и подобию можно добавить хоть сколько их) и при необходимости запускал неактивные…
В скрипте не забываем заменить адрес e-mail на свой… UPD: Добавил в скрипт еще и проверку на высокий Load Average (нагрузка на сервер) — при высоком значении (у меня это 15.0), будет отправляться предупреждение, что нагрузка слишком высока…