21 сентября 2012 г.

Мониторим сервера. Ping



Блог переехал на https://shapkin.me


Пожалуй в жизни каждого спеца, наступает период, когда надо либо ставить какого-либо монстра мониторинга, по типу zabbix'a или nagios'a, ну или системы попроще, но ничуть не хуже, местами превосходящие (munin, cacti и др.), все дело вкуса, либо подумывать о собственных скриптах, ну или уже готовых решениях. Чаще всего это именно shell скрипты, ввиду простоты их написания и гибкости, при поставленных задачах.

 Вот и в моей жизни настал такой момент :smile: Итак, ниже код скрипта с простыми пояснениями:
#!/bin/bash

ping="ping -c 4 -s 1 -W 1"
mailcmd=$(which mail)
mailaddr="yourmailaddress@mail.com"
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-ое выражение, а потом из него же - 1-ое.
4 packets transmitted, 4 received, 0% packet loss, time 3208ms
Перед тем, как начать выборку, мы указали, что выражения разделены запятыми « awk -F',' ». Теперь мы проверяем, что кол-во пакетов (результат всей выборки будет заноситься в переменную count) не равно 0, ну а если такое случится - заносим данные в лог. После того, как все сервера прогоняются, мы получаем окончательно сформированный лог, который и отсылается нам на почту, в случае надобности. Соответственно, если все сервера пингуются и поле received не равно 0, письмо не приходит, а значит все работает как часы(не факт конечно, но мы сейчас исключительно про сетевую доступность наших машин). Ну и после отправки письма, делаем паузу в 1 секунду и удаляем наш лог.   Этот скрипт безусловно не претендует на уникальность, но от лишних забот избавляет :)              

Комментариев нет:

Отправить комментарий