Скрипт мониторинга сервера по ping
Пожалуй в жизни каждого спеца, наступает период, когда надо либо ставить какого-либо монстра мониторинга, по типу zabbix’a или nagios’a, ну или системы попроще, но ничуть не хуже, местами превосходящие (munin, cacti и др.).
Все дело вкуса, либо подумывать о собственных скриптах, ну или уже готовых решениях.
Чаще всего это именно shell скрипты, ввиду простоты их написания и гибкости, при поставленных задачах.
Вот и в моей жизни настал такой момент. Итак, ниже код скрипта с простыми пояснениями:
#!/bin/bash
ping="ping -c 4 -s 1 -W 1"
mailcmd=$(which mail)
mailaddr="[email protected]"
HOSTS="domain.com n1.domain.com n2.domain.com"
msg="$(pwd)/ping.$$"
send_mail(){
$mailcmd -s "Проверка сервера $hst" $mailaddr < $msg
}
for hst in $HOSTS
do
count=$($ping $hst|grep "received"|awk -F',' '{ print $2 }'|awk '{ print $1 }')
if [[ $count -eq 0 ]]; then
echo "$(date '+%d %b %H:%M:%S'): Сервер $hst не пингуется! " >> $msg
fi
done
send_mail
sleep 1
rm -f $msg
Алгоритм работы следующий:
Берем список доменов и попеременно пингуем каждый из них. Если хоть один не пингуется - заносим информацию об этом во временный файл и, после того, как все проверки отработали - отсылаем письмо.
Теперь рассмотрим конкретнее:
ping -c
указываем кол-во пакетов -s
указываем размер пакета -W
указываем лимит для timeout’а HOSTS Тут перечисляем все необходимые нам сервера, домены и/или айпишники.
msg
Обозначаем место сохранения временного лога, соответственно лог будет лежать в той же директории, откуда запускается скрипт.
Проверка
Самое главное начинается.
Цикл for перебирает наши сервера по списку и подставляет по очереди в скрипт, где идет пинг по заданным параметрам, затем грепаем по выражению received
(нас же интересуют потери пакетов) и после передаем найденную строку на парсинг awk’у, который сперва выбирает 2-ое выражение(received), а потом из него же - 1-ое(4).
4 packets transmitted, 4 received, 0% packet loss, time 3208ms
Перед тем, как начать выборку, мы указали, что выражения разделены запятыми awk -F','
.
Теперь мы проверяем, что кол-во пакетов (результат всей выборки будет заноситься в переменную count) не равно 0, ну а если такое случится - заносим данные в лог.
После того, как все сервера прогоняются, мы получаем окончательно сформированный лог, который и отсылается нам на почту, в случае надобности.
Соответственно, если все сервера пингуются и поле received не равно 0, письмо не приходит, а значит все работает как часы(не факт конечно, но мы сейчас исключительно про сетевую доступность наших машин).
Ну и после отправки письма, делаем паузу в 1 секунду и удаляем наш лог. Этот скрипт безусловно не претендует на уникальность, но от лишних забот избавляет.