The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"  Нужно создать скрипт для опроса (пинга) серверов."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Учет трафика, статистика / FreeBSD)
Изначальное сообщение [ Отслеживать ]

"  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Oleg A on 19-Июл-14, 18:54 
Добрый день.
У меня уже есть скрипт который опрашивает сервера и сообщает о проблемах по имейл. Но он очень примитивный. Одни и теже действия я прописываю в скрипте для всех серверов.
Сейчас же хотелось переписать его более грамотно. К сожалению пока самостоятельно это сделать не получается.
Исходные данные:
1.Файл server.list - список серверов и параметров для опроса. Формат его следующий:
      # IP; Name; max_packet_loss;wait;count;interval
2.Файл скрипта server-check.sh который должен взять параметры из файла server.list и выполнить для каждой строки что-то вроде:
==========================
gw1_curr_packet_loss=`ping -c20 -i0.05 -q -W50 ${IP-SERVER} | grep loss | awk '{print $(NF-2)}' | cut -d"." -f1 | cut -d"%" -f1`
    if [ ${gw1_curr_packet_loss} -le ${gw1_max_packet_loss} ]
    then
        echo `date +"%T %d.%m.%Y"`. "GW1. [STATUS - OK]. Current packet loss to ${gw1} is ${gw1_curr_packet_loss}%." >> ${log}
        gw1_curr_status=1
    else
        echo `date +"%T %d.%m.%Y"`. "GW1. [STATUS - CRITICAL]. Current packet loss to ${gw1} is ${gw1_curr_packet_loss}%." >> ${log}
    echo "$gw1_down" | $mailsend
        gw1_curr_status=0
    fi
==========================
Если кто может подскажите плиз как это правильно написать. Заранее спасибо.
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "  Нужно создать скрипт для опроса (пинга) серверов."  +2 +/
Сообщение от Алексей (??) on 19-Июл-14, 19:17 
> Добрый день.
> У меня уже есть скрипт который опрашивает сервера и сообщает о проблемах
> по имейл.

Сорри, не по существу, но может стоит развернуть полноценную систему мониторинга...zabbix к примеру?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Oleg A on 19-Июл-14, 19:29 
> Сорри, не по существу, но может стоит развернуть полноценную систему мониторинга...zabbix
> к примеру?

Беспорно стоит. Планирую это осуществить на следующем этапе. Но пока хочу просто модернизировать то что имею. Кроме того на этом примере будет очень познавательно понять как создавать  функции в скриптах в шеле и как передавать этим функции параметры из других файлов.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

5. "  Нужно создать скрипт для опроса (пинга) серверов."  –2 +/
Сообщение от mrrr on 20-Июл-14, 22:57 
> Беспорно стоит. Планирую это осуществить на следующем этапе. Но пока хочу просто
> модернизировать то что имею. Кроме того на этом примере будет очень
> познавательно понять как создавать  функции в скриптах в шеле и
> как передавать этим функции параметры из других файлов.

Советую десять раз подумать, прежде чем внедрять систему мониторинга. Все что я видел, а это zabbiz, nagios, Oracle BAM - чудовищно неюзабельно. И лично я пришел к выводу, что разворачивать СМ следует только когда не осталось других вариантов. У меня сейчас в зоне ответственности один боевой сервер с несколькими приложениями на нем, мониторится исключительно скриптами и я счастлив. Это конечно ваше дело, но ИМХО зря вы так категоричны относительно "бесспорно стоит".

Что касается скрипта, то переписал бы в таком стиле:

#!/usr/bin/env bash


SERVER_LIST="server.list"
LOG="log"
pattern="([0-9]+).[0-9]+% packet loss"
dt=$(date +"%T %d.%m.%Y")


main(){
  while read ip ml c i w
    do ping_res=$(ping -c $c -i $i -W $w $ip)
      if [[ $ping_res =~ $pattern ]]
      then
        loss=${BASH_REMATCH[1]}
      fi
      if [[ $loss -ge $ml ]]
      then
        log "OK" $ip $loss
      else
        log "CRITICAL" $ip $loss
      fi
  done < <(cat $SERVER_LIST)
}


log(){
  echo "$dt STATUS - $1 Current packet loss to $2 is $3%" >> $LOG
}

main

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

6. "  Нужно создать скрипт для опроса (пинга) серверов."  +1 +/
Сообщение от mrrr on 20-Июл-14, 23:21 
зря $dt запомнил...


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "  Нужно создать скрипт для опроса (пинга) серверов."  +1 +/
Сообщение от shadow_alone (ok) on 20-Июл-14, 23:57 
> У меня сейчас в зоне ответственности один
> боевой сервер с несколькими приложениями на нем, мониторится исключительно скриптами и
> я счастлив.

Аргумент просто бесспорный, и количество серверов вызывает уважение.
Сидели бы чтоль, молчали в тряпочку, знаток систем мониторинга.


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

9. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Oleg A on 21-Июл-14, 10:23 
> Аргумент просто бесспорный, и количество серверов вызывает уважение.
> Сидели бы чтоль, молчали в тряпочку, знаток систем мониторинга.

откуда столько грубости?

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

11. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Oleg A on 21-Июл-14, 10:26 
Спасибо. Очень интересное преображение начального скрипта. Проверю что у меня с этим получится.


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

12. "  Нужно создать скрипт для опроса (пинга) серверов."  +1 +/
Сообщение от McLeod095 (ok) on 21-Июл-14, 15:41 
> Спасибо. Очень интересное преображение начального скрипта. Проверю что у меня с этим
> получится.

Для аналогичной задачи использовал такой вот скрипт


#!/bin/bash

HOST="192.168.0.5"

if [ "$2" != "" ]; then
        HOST=$2
fi

PING="/bin/ping -c1 ${HOST}"
LOG="/root/ping.${HOST}.log"
E_LOG="/root/ping.${HOST}.error.log"
PID="/var/run/ping_daemon_${HOST}.pid"
TRIGGER=0
TIME=0
MAILTO="mail@mail.mail"

_daemon_exit(){
        echo "Kill the daemon"
        if rm -f ${PID}; then
                echo "Daemon exit"
        else
                echo "Could't delete pid file ${PID}"
        fi
        exit 0
}

_daemon_restart(){
        echo "Restart daemon"
}

daemon_stop(){
        kill $(cat ${PID})
}

daemon_restart(){
        kill -HUP $(cat ${PID})
}

do_it(){
        HOST=$1
        (
                ${PING} ${HOST} 2>&1>/dev/null
                local _ret=$?
                local _date=$(date)
                if [ "$_ret" == "0" ]; then
                        echo "${_date}: Ping with ${HOST} restore ()"
                fi
        ) &
}

daemon_start(){
        if [ -e ${PID} ]; then
                _pid=$(cat ${PID})
                echo "Daemon already running with pid ${_pid}"
                exit 0
        fi

        if [ -e ${LOG} ]; then
        fi

        cd /
        exec > ${LOG}
        exec 2> ${E_LOG}
        exec < /dev/null

        (
                trap "_daemon_exit; exit 0;" SIGTERM
                trap "_daemon_restart" HUP

                while [ 1 ]; do
                        _date=$(date)
                        ${PING} 2>&1>/dev/null
                        ret=$?
                        if [ "$ret" == "0" ]; then
                                if [ "$TRIGGER" == "1" ];then
                                        echo "${_date}: Ping with ${HOST} restore (${TIME})"
                                        echo "${_date}: Ping with ${HOST} restore (${TIME})" | mutt -s "${HOST} ping restore" $MAILTO
                                        TRIGGER=0
                                        TIME=0
                                fi
                        else
                                if [ "$TRIGGER" == "0" ]; then
                                        echo "${_date}: Ping with ${HOST} lost"
                                        echo "${_date}: Ping with ${HOST} lost (${TIME})" | mutt -s "${HOST} ping lost" $MAILTO
                                        TRIGGER=1
                                else
                                        let TIME=TIME+1
                                fi
                        fi
                        sleep 1
                done
        ) &

        echo $! > ${PID}
}

case $1 in
        "start")
                daemon_start
                ;;
        "stop")
                daemon_stop
                ;;
        "restart")
                daemon_restart
                ;;
        *)
                ;;
esac
exit 0

запускать так
./script.sh start ip
запускается как демон и раз в секунду пингует адрес
если плохо шлет на почту
Под себя думаю его заточить не трудно
В скрипте есть кое-что не используемое, думаю понятно что откуда и что можно убрать

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

18. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Oleg A on 24-Июл-14, 17:54 
> Для аналогичной задачи использовал такой вот скрипт
>
 

Отличный скрипт. Переварю - отпишусь


Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

15. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Oleg A on 24-Июл-14, 17:47 
разобрася наконец-то )
Огромное спасибо!! Подход понятен и идеально мне подходит. На основе его подганяю скрипт сейчас все под себя. Чуть позже выложу что у меня вышло.


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

16. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Oleg A on 24-Июл-14, 17:49 
> разобрася наконец-то )
> Огромное спасибо!! Подход понятен и идеально мне подходит. На основе его подганяю
> скрипт сейчас все под себя. Чуть позже выложу что у меня
> вышло.

это было ответ  mrrr


Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

3. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Аноним (??) on 19-Июл-14, 21:25 
> Если кто может подскажите плиз как это правильно написать. Заранее спасибо.

1) Использовать специально приспособленный fping, а не парсить вывод пинга.
yukra@yukra-ThinkPad ~ $ fping 192.168.0.15 -q
yukra@yukra-ThinkPad ~ $ echo $?
1
yukra@yukra-ThinkPad ~ $ fping ya.ru -q
yukra@yukra-ThinkPad ~ $ echo $?
0
2) Забить на колво потерь, совсем, решительно! Если хост ответил на 1 из 10 пакетов, значит хост жив. Хотите видеть колво потерь до хоста, то опять же fping
yukra@yukra-ThinkPad ~ $ fping -C20 ya.ru  2>&1
ya.ru : [0], 84 bytes, 3.15 ms (3.15 avg, 0% loss)
ya.ru : [1], 84 bytes, 3.08 ms (3.11 avg, 0% loss)
ya.ru : [2], 84 bytes, 3.96 ms (3.39 avg, 0% loss)
ya.ru : [3], 84 bytes, 3.05 ms (3.31 avg, 0% loss)
ya.ru : [12], 84 bytes, 5.22 ms (3.69 avg, 61% loss)
ya.ru : [13], 84 bytes, 3.54 ms (3.66 avg, 57% loss)
ya.ru : [14], 84 bytes, 44.2 ms (9.46 avg, 53% loss)
ya.ru : [15], 84 bytes, 3.54 ms (8.72 avg, 50% loss)
ya.ru : [16], 84 bytes, 3.03 ms (8.09 avg, 47% loss)
ya.ru : [17], 84 bytes, 4.87 ms (7.76 avg, 44% loss)
ya.ru : [18], 84 bytes, 48.3 ms (11.4 avg, 42% loss)
ya.ru : [19], 84 bytes, 3.05 ms (10.7 avg, 40% loss)

ya.ru : 3.15 3.08 3.96 3.05 - - - - - - - - 5.22 3.54 44.24 3.54 3.03 4.87 48.39 3.05

3) Все таки заббикс и не стоит анониро^Wстдарать фигней. Тренируйтесь на кошках, а не на мониторинге

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Pahanivo (ok) on 19-Июл-14, 23:28 
4) а если таки взялись колхозить, то таки научиться парсить "return value" от тулз - благо они рулез да и вообще сильно помогают в жизни, маны в помощь: ... The ping utility returns an exit status of zero if at least one response was heard from the specified host ...

и ваш скрипт чудесным обазом сокращается до двух строк ...

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

14. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от universite email(ok) on 22-Июл-14, 17:19 
> Добрый день.
> У меня уже есть скрипт который опрашивает сервера и сообщает о проблемах
> по имейл. Но он очень примитивный. Одни и теже действия я
> прописываю в скрипте для всех серверов.

поставьте sysutils/monit
Monit - utility for monitoring services on a Unix system
и не мучайтесь.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

17. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Oleg A on 24-Июл-14, 17:51 
>> Добрый день.
>> У меня уже есть скрипт который опрашивает сервера и сообщает о проблемах
>> по имейл. Но он очень примитивный. Одни и теже действия я
>> прописываю в скрипте для всех серверов.
> поставьте sysutils/monit
> Monit - utility for monitoring services on a Unix system
> и не мучайтесь.

мониторить нужно список серверов. Monit не подойтет. Хотя интересный и буду иметь его ввиду.

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

19. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от universite email(ok) on 24-Июл-14, 18:40 

> мониторить нужно список серверов. Monit не подойтет. Хотя интересный и буду иметь
> его ввиду.

и что?
будет сотня-две

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

20. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от Oleg A on 25-Июл-14, 15:16 
Вот такое у меня получилось:

#!/bin/bash
SERVER_LIST="servers.list"
pattern="([0-9]+).[0-9]+% packet loss"
LOG="/var/log/ping-hosts.log"
# Dlja ochistki vcherashnego dnja (hranenie loga za odin den')
yesterday=`/bin/date -v -1d "+%d.%m.%Y"`

main(){
awk '{FS=";"} !/^#/ { print $0 }' servers.list |  while read ip nm ml c i w
  do
        mailsend="mail -s ""$ip is DOWN"" MyMAIL@gmail.com -r MyMAIL@gmail.com
        mailmsg="$nm ALERT: Chanel to $nm $ip is DOWN $(date)"
        ping_res=$(ping -c $c -i $i -W $w $ip)
        if [[ $ping_res =~ $pattern ]]
        then
               loss=${BASH_REMATCH[1]}
               echo $ip $loss
        fi
        if [[ $loss -le $ml ]]
        then
                log "OK" $ip $loss
        else
                log "CRITICAL" $ip $loss
                echo $mailmsg | $mailsend
        fi
  done
}

log(){
        dt=$(date +"%T %d.%m.%Y")
        echo "$dt STATUS - $1 Current packet loss to $2 is $3%" >> $LOG
}

# Esli log-fajl ne najden, sozdaem ego, inache, esli est' zapisi starshe 1 dnja
clear_log ()
{
if [ ! -f ${LOG} ]
then
    touch ${LOG}
else
     if cat ${LOG} | grep ${yesterday} > /dev/null
     then
         cat /dev/null > ${LOG}
     fi
fi
}

clear_log
main


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

21. "  Нужно создать скрипт для опроса (пинга) серверов."  +/
Сообщение от mrrr on 25-Июл-14, 23:05 
> Вот такое у меня получилось:
> ...

Супер. Единственное, не люблю в скриптах палки (pipe). Т.е. я их обожаю когда надо быстро слепить однострочник, но не в скриптах. Потому что на мой взгляд это портит читабельность.
Можно было бы сделать предпарсинг, который удалял комментарии и все остальное, что нужно удалить.
Это, конечно, болтовня на самом деле. Если скрипт достаточно читабелен, а тут не 250 палок вряд, если он достаточно хорошо реализует функциональные требования и т.д. То оверинженеринг на фиг никому не нужен.
И совсем последнее. Видел несколько систем мониторинга самописных, которые производили приятное впечатление. Видел также и настолько ужасные самописные СМ, которыми никого не удалось заставить пользоваться и их просто списывали в утиль. Т.е. я не против систем мониторинга как класса. Но если например нужен функционал разбора csv файла, чтобы отдать его биллингу, то не обязательно ставить HP IUM. Можно найти маленькую программу или написать самому. И это  решение будет выигрывать по всем параметрам. Если у тебя сотни коммутаторов от десятков вендоров, каждый из которых гадит в своем формате, то тогда можно задуматься над готовой платформой, пускай даже такой неудобной как IUM. Не обязательно внедрять, но задуматься, взвесить "за" и "против" - можно.

COMMENT="^#"

main(){
  while IFS=';' read  a b
    do
      if [[ $(preparse $a) == true ]]
      then
        echo $a
        echo $b
      else
        :
      fi
  done < <(cat $SERVER_LIST)
}


preparse(){
  if [[ ! ($1 =~ $COMMENT) ]]
  then
    echo true
  fi
}

main


Данные:
## Esli log-fajl ne najden; sozdaem ego, inache, esli est' zapisi starshe 1 dnja
4;5
#fkd kfn dlk n dkfnd
iah;jf#

Вывод:
4
5
iah
jf#

Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру