Скрипт мониторинга сервера по 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 секунду и удаляем наш лог. Этот скрипт безусловно не претендует на уникальность, но от лишних забот избавляет.


comments powered by Disqus