Для владельцев VDS/VPS или серверов может возникнуть необходимость в контроле работы процессов, таких как: apache, nginx и т.д. На днях наткнулся на небольшой bash-скрипт, который позволяет следить за тем, запущены ли нужные процессы, и если нет, то запускает их.

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

#!/bin/bash
 
############################################################################
# Проверка статуса apache, nginx, mysql, ssh и перезагрузка сервисов при необходимости
############################################################################
 
# Команда для отправки почты
MAILCMD="$(which mail)"
# Файл письма
MAILMESSAGE="/tmp/vps_service.fail.$$"
# Email, куда слать уведомления
EMAIL="test@mail.ru"

# выясняем состояние служб
ApacheService="$(ps -A|grep apache2|wc -l)"
NginxService="$(ps -A|grep nginx|wc -l)"
MysqldService="$(ps -A|grep mysql|wc -l)"
SSHService="$(ps -A|grep ssh|wc -l)"

# Функция для отправки письма
mail_doxer() {
	if [ $MAILCMD ]; then
		$MAILCMD -s "Уведомление о проблемах на VPS-сервере $(hostname)" $EMAIL < $MAILMESSAGE
	fi
}

# функция для вывода сообщений и логирования
logger() {
	echo "$@"
	echo "$@" >> $MAILMESSAGE
} 

# проверяем, запущена ли служба
check_service(){
	RESULT="$(ps -A|grep $1|wc -l)"
	if [[ $RESULT -eq 0 ]]; then
		logger "ОШИБКА:"
		logger "-- При проверке обнаружено, что служба $1 не была запущена!"
		logger "-- Произведена попытка запуска в $(date +"%d.%m.%y %H:%M:%S")..."
		# Пытаемся запустить сервис
		/etc/init.d/$1 start
		# "Вздремнем" на секундочку (так, на всякий пожарный)
		sleep 1
		# Проверяем, работает ли сервис после выполнения скрипта
		logger "ТЕКУЩИЙ СТАТУС:"
		RESULT="$(ps -A|grep $1|wc -l)"
		if [[ $RESULT -eq 0 ]]; then
			logger "-- служба $1 сейчас НЕ ЗАПУЩЕНА!"
			logger ""
		else
			logger "-- $1 сейчас запущена..."
			logger ""
		fi
	fi
}

logger "Данное письмо отправлено Вам, так как были обнаружены проблемы"
logger "на сервере $(hostname), а Ваш адрес указан в скрипте для таких уведомлений"
logger "----------------------------------------"
logger ""

# Проверяем, запущен ли Apache
check_service "apache2"

# Проверяем, запущен ли Nginx
check_service "nginx"

# Проверяем, запущен ли MySQL
check_service "mysql"

# Проверяем, запущен ли SSH
check_service "ssh"

# Получаем текущее значение LA
LOAD="$(uptime | grep -o 'load average.*' | cut -c 15-18)"

# Если оно больше указанного ниже значения, то это также повод для беспокойства
if [[ $LOAD > 15.0 ]]; then
	logger "ВНИМАНИЕ!!! Слишком большая нагрузка!"
	logger "-- Текущий Load Average: $LOAD "
else
	logger "-- Текущий Load Average: $LOAD "
fi

logger "----------------------------------------"
logger "***	Это письмо сгенерировано скриптом $(basename $0)		***"
logger "***	Не стоит отвечать на это письмо, это всего лишь уведомление	***"

# Проверяем, был ли нерабочим хоть один из проверяемых сервисов, если да, то шлем емэйл
if [[ $ApacheService -eq 0 ]] || [[ $NginxService -eq 0 ]] || [[ $MysqldService -eq 0 ]] || [[ $SSHService -eq 0 ]] || [[ $LOAD > 15.0 ]]; then
	mail_doxer
fi

# "Вздремнем" на секундочку (так, на всякий пожарный)
sleep 1

#Удаляем временный файл письма
rm -f $MAILMESSAGE

  • спасибо, помогло, только не apache2 а httpd, ну и sshd, mysqld и косяк в скрипте если пути установки не по умолчанию, надо тогда скрипты создать в /etc/init.d/ для всех прог 🙂

    • ailme

      В данном случае скрипт рассчитан на debian системы,а там процесс называется apache2