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

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

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

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

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

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

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

    насколько я представляю, это должен быть некий скрипт, который надо как-то заставить автозапускаться и всё время выполяться. Не хочу изобретать велосипед, да и скриптов под Debian я никогда не писал, может быть кто подскажет решение?
  2. 27 Мая 2011 Птн 17:34:07
    AlexAdmin писал : Для повышения стабильности работы форма нужно решить такую задачку:

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


    #!/bin/bash
    ping -c 1 xxx.xx
    result=$?
    if [ "result"=="0"]; then
    выполняем свое, все пингуется
    else
    выполняем если не пингуется
    fi

    в кронтаб добавляем запись
    */1 * * * * root путь до нашего скрипта

    и не важно, дебиан - не дебиан, это юникс, разницы как писать нет
  3. 27 Мая 2011 Птн 17:37:11
    можно после пинга написать >/dev/null 2>&1 чтобы крон лог не засирал
  4. 27 Мая 2011 Птн 19:19:46
    evgenyk писал ? ? :...

    спасибо, идея примерно понятна, только судя по тексту такой скрипт будет срабатывать не тогда, когда хост меняет состояние с онлайна на оффлайн или наоборот, а просто после каждого пинга, в зависимости от результата.
  5. 27 Мая 2011 Птн 19:52:37
    Ну если не пингуется, значит оффлайн, верно?
    Он будет запускаться кроном каждую минуту и запускать нужные действия в зависимости от состояния пингуемого хоста.
  6. 27 Мая 2011 Птн 19:55:23
    evgenyk писал : Ну если не пингуется, значит оффлайн, верно?
    Он имеет ввиду, что нужно где-то сохранять последнее состояние, и если оно изменилось - проводить действия. А сейчас будет каждые условные 5 минут слаться сообщение о том, что сервер оффлан, а когда выйдет онлайн - ничего не произойдёт (или будет происходить каждые те же 5 условных минут).
  7. 27 Мая 2011 Птн 20:07:38
    Код:
    #!/bin/bash

    host="ya.ru"
    state=`cat /etc/state` # В нем храним последнее состояние
    count=1
    inc=1
    threshold=3            # Порог, по превышении которого считаем что хост устойчиво работает

    for i in `seq 1 5`
      do
        ping -c1 -w1 $host
        result=$?
        if [ "result"=="0"]; then
          echo "online">/etc/state
          cstate="online"
          count=$(($count + $inc)) # Считаем, сколько раз ответил хост
        else
          echo "offline">/etc/state
          cstate="offline"
        fi
      done

    if [ "$count" -ge "$threshold" ]; then
      if [ "$state"!="cstate" ]; then
        Состояние изменилось, запускаем то, что надо
      fi
    fi
  8. 27 Мая 2011 Птн 22:02:00
    такая штука называется watchdog и запускается, как правило, в виде демона (или по &).
    "Человек свыше" привел годный скрипт.
  9. 27 Мая 2011 Птн 22:26:22
    Спасибо "человеку свыше" за подсказку идеологии скрипта, я на этой основе написал по аналогии то, что вроде бы даже работает:
    Код:

    #!/bin/bash
    host="8.8.4.4"
    stafil="/etc/old-state-"$host #Файл, где хранится предыдущее состояние хоста
    threshold=3 # Порог, выше которого считаем что хост online
    count=0
    for i in `seq 1 3`
    do
       ping -c1 -w1 $host >/dev/null
       if [ $? -eq 0 ]; then
          count=$(($count + 1))
       fi
    done
    if [ "$count" -ge "$threshold" ]; then
       newsta=1
    else
       newsta=0
    fi
    oldsta=$(cat "$stafil")
    if [ $? -ne 0 ]; then
       oldsta=0
    fi
    if [ $oldsta -ne $newsta ]; then
       echo $newsta>"$stafil"
       if [ $newsta -eq 1 ]; then
          echo "Do it when $host go ONLINE"
       else
          echo "Do it when $host shut down"
       fi
    fi

    Осталось ввести реальные адреса и командочки и прикрутить это к крону и потестить...

    А где можно почитать описание командочек, доступных в этом языке? Извиняюсь за невежество, просто язычок-то вроде занимательный Смайлик :-)
  10. 27 Мая 2011 Птн 22:28:16
    [внешняя ссылка]
    поставь /dev/null 2>&1, иначе вывод с stderr будет падать в лог
  11. 27 Мая 2011 Птн 22:31:53
    Все же вышеприведенный скрипт делает несколько не то, что просил тс, как я понял команды выполняются разные в зависимости от состояния..
    Переделал слегка, да простит меня evgenyk Мы краснеем!

    Код:
    #!/bin/bash

    host="ya.ru"
    state=`cat /etc/state` # В нем храним последнее состояние
    count=0
    threshold="3" # Порог, по превышении которого считаем что хост устойчиво работает

    for i in {1..5}
    do
    ping -c1 -w1 $host
    result=$?
    if [[ "$result" == "0" ]]; then
    let count=$count+1 # Считаем, сколько раз ответил хост
    fi
    done

    if [[ $count > $threshold ]]; then
    echo "online">/etc/state
    cstate="online"
    else
    echo "offline">/etc/state
    cstate="offline"
    fi
    if [[ $state != $cstate ]] && [[  $state = "online" ]]; then
    echo '2) в случае если пинговался и перестал - выполнить одну команду ' # Заменить на команду
    elif [[ $state != $cstate ]] && [[ $state = "offline" ]]; then
    echo '3) в случае если опять начал пинговаться - выполнить другую команду ' # Заменить на команду
    fi
  12. 27 Мая 2011 Птн 22:36:41
    ага, спасибо, а как в кронтаб добавлять запуск этого скрипта, и куда такие скрипты лучше положить?
    сейчас например он "/root/test.sh"
    и как его заставить выполняться, например, раз в 10 секунд?
  13. 27 Мая 2011 Птн 22:39:15
    AlexAdmin писал : ага, спасибо, а как в кронтаб добавлять запуск этого скрипта, и куда такие скрипты лучше положить?
    сейчас например он "/root/test.sh"
    и как его заставить выполняться, например, раз в 10 секунд?

    в файл /etc/crontab дописываешь строку
    */1 * * * * root /root/test.sh и после нее добавляешь пустую строку.
    У крона минимальная периодичность минута.
  14. 27 Мая 2011 Птн 22:47:18
    да, с кроном 10 сек не получится..
    как вариант - сделать следующим образом:

    while true
    do
    весь вышенаписанный код
    sleep 10
    done

    и запустить без крона, добавив в конце &
    А в крон поставить скрипт на проверку работы этого процесса, и перезапуска в случае его отсутствия (Это если совсем заняться нечем Very Happy )
  15. 27 Мая 2011 Птн 22:54:58
    Вот слегка подпилил код с учетом всего вышесказанного:
    Код:

    #!/bin/bash
    host="8.8.4.4"
    stafil="/etc/old-state-"$host #Файл, где хранится предыдущее состояние хоста
    threshold=3 # Порог, выше которого считаем что хост online
    count=0
    for i in {1..3}
    do
       ping -c1 -w1 $host >/dev/null 2>&1
       if [ $? -eq 0 ]; then
          count=$(($count + 1))
       fi
    done
    if [ "$count" -ge "$threshold" ]; then
       newsta=1
    else
       newsta=0
    fi
    oldsta=$(cat "$stafil" 2>/dev/null)
    if [[ "$oldsta" != "1" ]] && [[ "$oldsta" != "0" ]] ; then
       oldsta=0
       echo $newsta>"$stafil"
    fi
    if [ $oldsta -ne $newsta ]; then
       echo $newsta>"$stafil"
       if [ $newsta -eq 1 ]; then
          echo "Do it when $host go ONLINE"
       else
          echo "Do it when $host shut down"
       fi
    fi


    щас буду экспериментировать с кроном...
    а, кстати, после того как я файл /etc/crontab исправляю, надо как-то крон рестартить или он сам поймет что параметры изменились?

    вообще, конечно, по хорошему бы проверку раз в 5-10 секунд проводить бы следовало, чтобы максимально ускорить реакцию на событие...
На страницу: Назад  1, 2, 3  Вперёд