Автор скрипта nekr0z (nekr0z@mail.ru)
Идея и постановка задачи - Lorgus (alex@tcp.ru)
#!/bin/bash
# Скрипт для проверки состояния серверов, версия 1.0.1
# (c) nekr0z (nekr0z@mail.ru), 2008
# Идея и постановка задачи - Lorgus (alex@tcp.ru)
# Скрипт публикуется под лицензией GPL
# ВНИМАНИЕ:
# Скрипт при работе довольно интенсивно выводит информацию в консоль.
# При запуске рекомендуется перенаправлять вывод в лог (если это интересно)
# или (если неинтересно) - в /dev/null
# Проверка состояния серверов производится ping’ом.
# Если сервер отвечает на ping, он считается живым (хотя это не всегда так).
# Соответственно, не отзывающийся на ping сервер считается мёртвым (хотя это тоже не всегда так).
######################################################################
######### НАСТРОЙКИ ##################################################
# E-mail админа:
MAIL_ADDR=”nekr0z@localhost nekr0z@mail.ru” # можно отправлять сразу нескольким, разделив адреса пробелами
# Subject писем:
MAIL_SUBJ=”New state of servers”
# Список серверов для проверки;
# каждый - отдельной строкой вида:
# SERVER[n]=”адрес или IP”
SERVER[1]=”192.168.0.1″
SERVER[2]=”192.168.0.2″
SERVER[3]=”mail.ru”
######################################################################
######################################################################
# Предполагаем, что все сервера изначально живы.
for i in `seq 1 ${#SERVER[@]}`; do
SERVER_STATE[$i]=3 # В массиве $SERVER_STATE хранятся состояния серверов, а именно:
# 0 - мёртвый, 1 - только что умер,
# 2 - ожил, 3 - живой.
done
# Начинаем работать.
while true
do
# Проверяем все сервера.
echo Checking servers…
for i in `seq 1 ${#SERVER[@]}`; do
echo Server ${SERVER[$i]}
if [[ `ping ${SERVER[$i]} -w 1 | grep “0 received”` = “” ]]; then
# Сервер жив…
echo looks alive
if [[ ${SERVER_STATE[$i]} > 1 ]]; then
# и был жив.
SERVER_STATE[$i]=3
else
# ожил.
SERVER_STATE[$i]=2
fi
else
# Сервер мёртв…
echo looks dead
if [[ ${SERVER_STATE[$i]} > 1 ]]; then
# только что умер.
SERVER_STATE[$i]=1
else
# давно мёртв.
SERVER_STATE[$i]=0
fi
fi
done
# Пауза перед повторной проверкой:
sleep 10;
# Повторная проверка умерших серверов:
echo Checking servers gone dead…
for i in `seq 1 ${#SERVER[@]}`; do
if [[ ${SERVER_STATE[$i]} = 1 ]]; then
echo Server ${SERVER[$i]}
if [[ `ping ${SERVER[$i]} -w 1 | grep “0 received”` = “” ]]; then
# оказывается, живой!
echo appears to be alive
SERVER_STATE[$i]=3
else
# таки умер.
echo has really gone dead
SERVER_STATE[$i]=1
fi
fi
done
# Составляем отчёты:
for i in `seq 1 ${#SERVER[@]}`; do
if [[ ${SERVER_STATE[$i]} = 1 ]]; then
# server gone dead
GONE_DEAD=$GONE_DEAD” “${SERVER[$i]}
fi
if [[ ${SERVER_STATE[$i]} = 2 ]]; then
# server gone alive
GONE_ALIVE=$GONE_ALIVE” “${SERVER[$i]}
fi
done
if [[ $GONE_DEAD != "" ]]; then
MESSAGE=”DEAD: “$GONE_DEAD
fi
if [[ $GONE_ALIVE != "" ]]; then
MESSAGE=$MESSAGE” NOW ALIVE: “$GONE_ALIVE
fi
# Сообщаем админу:
if [[ $MESSAGE != "" ]]; then
echo $MESSAGE
echo $MESSAGE | mail -s “$MAIL_SUBJ” “$MAIL_ADDR”
echo Mailed!
fi
echo
echo
echo
# Обнуляем отчёты и отдыхаем до следующей проверки:
GONE_DEAD=”"
GONE_ALIVE=”"
MESSAGE=”"
sleep 50;
done
##########################################################
# История изменений:
#
# 1.0 - исходная версия
#
# 1.0.1 - пофиксил обращение с subject и адресатом письма, теперь в subj можно ставить пробелы,
# а адресатов может быть несколько.