Index · Правила · Поиск· Группы · Регистрация · Личные сообщения· Вход

Список разделов Разработка форума
 
 
 

Раздел: Разработка форума Простой скрипт-пинговалка для Debian (решено) 

Создана: 27 Мая 2011 Птн 14:02:53.
Раздел: "Разработка форума"
Сообщений в теме: 31, просмотров: 85448

На страницу: Назад  1, 2, 3  Вперёд
  1. 27 Мая 2011 Птн 14:02:53
    Для повышения стабильности работы форма нужно решить такую задачку:

    1) надо постоянно пинговать некий хост, и определять, пингуется он или нет
    2) в случае если пинговался и перестал - выполнить одну команду
    3) в случае если опять начал пинговаться - выполнить другую команду

    в общем чтобы так оно всё время работало, как только меняется состояние пингуемости некоего хоста, надо выполнять ту или другую команду, одну на "онлайн", другую на "оффлайн"

    насколько я представляю, это должен быть некий скрипт, который надо как-то заставить автозапускаться и всё время выполяться. Не хочу изобретать велосипед, да и скриптов под Debian я никогда не писал, может быть кто подскажет решение?
  2. 28 Мая 2011 Суб 16:41:07
    Итак, вот итоговый "боевой" вариант скрипта:
    ( файл /etc/pingwa/pingwa.sh )
    Код:
    #!/bin/bash
    host=$1
    selfname="pingwa"
    selfpath="/etc/$selfname"
    logfil="$selfpath/$selfname.log" #сюда бум писать события онлайн/оффлайн
    threshold=2 # Порог, выше которого считаем что хост online
    stafil="$selfpath/old-state-"$host #Файл, где хранится предыдущее состояние хоста
    #подсчитаем количество аналогичных процессов:
    ccnt=$( ps ax | grep -v grep | grep $selfname\.sh | grep -c $host )
    if [ $ccnt -ge 3 ]; then #если процессов и так шибко много, завершаемся
       msg="Already running $selfpath/$selfname.sh $host"
       echo $(date) $msg >>$logfil
       echo $msg
       exit 0
    fi
    if [ "$2" == "new" ]; then #Параметр new сотрет последнее запомненное состояние хоста
       rm -f $stafil
    fi
    msg="Watching host $host"
    echo $msg
    echo $(date) $msg >>$logfil
    while true
    do
    count=0
    for i in {1..5}
    do
       ping -c1 -w1 $host &>/dev/null
       if [ $? -eq 0 ]; then # посчитаем кол-во успешных пингов
          count=$(($count + 1))
       fi
    done
    if [ "$count" -ge "$threshold" ]; then #если мы набрали хотя бы 2 ответа из 5
       newsta=1 #то, будем считать что хост онлайн
    else
       newsta=0 #иначе - оффлайн
    fi
    oldsta=$(cat "$stafil" 2>/dev/null)
    if [[ "$oldsta" != "1" ]] && [[ "$oldsta" != "0" ]]; then
       oldsta=9 # так любое состояние хоста ниже будет считаться отличающимся от предыдущего
    fi
    if [ $oldsta -ne $newsta ]; then # если новое состояние хоста отличается от предыдущего
       echo $newsta>"$stafil"
       if [ $newsta -eq 1 ]; then
          event="ONLINE"
          #связь с сервером восстановлена - запускаем nginx
          nginx 2>>$logfil
       else
          event="shut down"
          #связь с сервером потеряна - вырубаем nginx
          #nginx -s stop 2>>$logfil
          service nginx stop
       fi
       event="host: $host $event"
       echo $event
       echo $(date) $event  >>$logfil
       
    fi
    sleep 3
    done

    И для /etc/crontab
    Код:
    */1 * * * * root [ $(ps -aef | grep -c pingwa.sh) -ge 3 ] || (/etc/pingwa/pingwa.sh 192.168.80.2&) &>/etc/pingwa/cron


    А понадобился он для того, чтобы в том случае если, почему-то пропала связь с базовым сервером, убивать nginx. Ну а когда связь с сервером восстановилась - сразу подымать nginx.
    Иначе получается так: связь с базовым сервером пропадает, а nginx продолжает работать, и клиенты успешно цепляются браузерами на нерабочую "морду", и в ответ через какое-то время получают нечто вроде 404 File not found. Причем зеркальные сервера, может быть, в это время прекрасно работают, но клиентский браузер их использовать даже не пытается, потому что он и так вполне успешно устанавливает соединение.
    Чтобы обломать браузер с установкой соединения на нерабочую "морду" - убиваем nginx, тогда браузер не может на неё законнектиться и вынужден автоматически пробовать другой айпишник из доступного списка. То есть в таком случае он вынужден отстать от "умершей морды" и перейти на другую "морду", а она, может быть, работает.
На страницу: Назад  1, 2, 3  Вперёд