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

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

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

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

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

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

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

    насколько я представляю, это должен быть некий скрипт, который надо как-то заставить автозапускаться и всё время выполяться. Не хочу изобретать велосипед, да и скриптов под Debian я никогда не писал, может быть кто подскажет решение?
  2. 27 Мая 2011 Птн 22:57:32
    /etc/init.d/crond restart или service cron[d] restart или reboot Гы-гы-гы
  3. 27 Мая 2011 Птн 22:57:36
    файл /etc/crontab не нужно править руками. для этого есть команда crontab -e
    При выходе из редактора она сама обновляет планировщик.
  4. 27 Мая 2011 Птн 22:58:59
    Виталька писал : файл /etc/crontab не нужно править руками. для этого есть команда crontab -e
    При выходе из редактора она сама обновляет планировщик.
    ага, только она vi запускает. Ты хочешь чтобы у него мозг совсем взорвался?
  5. 27 Мая 2011 Птн 22:59:53
    Ну раз уж полез в дебри, пусть верно делает Wink
  6. 27 Мая 2011 Птн 23:03:10
    vi это конечно круто.
  7. 27 Мая 2011 Птн 23:03:25
    Виталька писал : Ну раз уж полез в дебри, пусть верно делает Wink

    Универсальный и верный способ это текстовый редактор и директория /etc/init.d
  8. 27 Мая 2011 Птн 23:11:08
    ну в общем в кроне работает, но это минимум 1 минута.
    а как добиться чтобы всё время в памяти висело, автозапускалось после ребута?
    я не совсем понял что значит "и запустить без крона, добавив в конце &"

    upd. а, понял, это запуск скрипта в отдельном потоке, выдаётся номер, который потом можно убить через kill номер

    а как автопроверку сделать, что скрипт запущен? наверняка решение стандартное какое-то есть
  9. 27 Мая 2011 Птн 23:18:23
    AlexAdmin писал :а как добиться чтобы всё время в памяти висело, автозапускалось после ребута?
    например добавить /root/test.sh в rc.local или [внешняя ссылка]
    AlexAdmin писал :я не совсем понял что значит "и запустить без крона, добавив в конце &"
    /root/test.sh & запускается в параллельном потоке
    AlexAdmin писал :и как автопроверку сделать, что скрипт запущен? наверняка решение стандартное какое-то есть
    Написать еще один скрипт для его проверки, а для его проверки еще один скрипт, а для его проверки еще од.............
  10. 27 Мая 2011 Птн 23:37:36
    думаю, проверку запущености можно реализовать на базе вызова по крону скрипта с такой командочкой:
    ps -aef | grep -c 'pingwa.sh'

    где pingwa.sh - имя скрипта,
    а возвращается результат либо 1 либо 2.
    если 2 значит запущено, иначе не запущено, как то так...
  11. 27 Мая 2011 Птн 23:50:02
    Зачем? /root/test.sh итак периодически запускается кроном
  12. 27 Мая 2011 Птн 23:53:31
    я думаю запустить этот скрипт без крона, а при помощи крона организовать проверку его запущености.
    сам скрипт ( /etc/pingwa/pingwa.sh ) на данный момент выглядит так:
    Код:

    #!/bin/bash
    host=$1
    stafil="/etc/pingwa/old-state-"$host #Файл, где хранится предыдущее состояние хоста
    threshold=3 # Порог, выше которого считаем что хост online
    while true
    do
    count=0
    for i in {1..4}
    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 #либо $newsta, смотря как реагировать на старте
       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
    sleep 5
    done

    то есть предполагается вызов с параметром "хост".
    и файлы состояний хранит в папке /etc/pingwa/
  13. 28 Мая 2011 Суб 0:16:00
    Если брать твой пример, то в крон нужно будет вписать
    */1 * * * * root [ "$(ps -aef | grep -c 'pingwa.sh')" -eq "1" ] && (/root/pingwa.sh)
    Должно работать по идее..

    evgenyk писал :ага, только она vi запускает. Ты хочешь чтобы у него мозг совсем взорвался?

    У меня везде нано запускает, по крайней мере на дебиане..
  14. 28 Мая 2011 Суб 1:47:22
    О, я придумал как сделать:
    надо сделать проверку, есть ли уже аналогичный процесс - если есть, то завершаться, если нет - то работать "до победного конца"
    Тогда такую задачу можно засунуть в крон.
    Если процесс почему-то погиб, то крон его запустит, процесс увидит что он единственный такой, и будет работать. А если увидит что уже есть другой аналогичный процесс, то сразу завершится.

    Только тогда вот что не понятно мне:
    а как вообще крон отнесётся к тому, что задача запустилась и никогда не кончилась? Нужен ли крону какой-то особый признак, что запущенная задача не предполагает завершения, или же крону просто пофигу и он только стартует задачу не обращая внимания на то чем дело кончится?

    А код пока получается примерно такой: ( /etc/pingwa/pingwa.sh )
    Код:

    #!/bin/bash
    host=$1
    selfname="pingwa"
    selfpath="/etc/$selfname"
    stafil="$selfpath/old-state-"$host #Файл, где хранится предыдущее состояние хоста
    threshold=2 # Порог, выше которого считаем что хост online
    #подсчитаем количество аналогичных процессов:
    ccnt=$( ps ax | grep -v grep | grep $selfname\.sh | grep -c $host )
    if [ $ccnt -ge 3 ]; then #если процессов и так шибко много, завершаемся
       echo "Already running $selfpath/$selfname.sh $host"
       exit 0
    fi
    if [ "$2" == "new" ]; then #Параметр new сотрет последнее запомненное состояние хоста
       rm -f $stafil
    fi
    echo "Watching changes host $host"
    while true
    do
    count=0
    for i in {1..5}
    do
       ping -c1 -w1 $host >/dev/null 2>&1
       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
          echo "Do it when $host go ONLINE"
       else
          echo "Do it when $host shut down"
       fi
    fi
    sleep 5
    done
  15. 28 Мая 2011 Суб 9:16:54
    Добавь это в крон, через минуту у тебя появится 1 работающий процесс твоего скрипта.
    Код:
    */1 * * * * root [ "$(ps -aef | grep -c 'pingwa.sh')" -eq "1" ] && (/etc/pingwa/pingwa.sh >/dev/null 2>&1) >/dev/null 2>&1


    [ "$(ps -aef | grep -c 'pingwa.sh')" -eq "1" ] && (/etc/pingwa/pingwa.sh) - это короткая запись проверки
    if ps -aef | grep -c 'pingwa.sh' = 1 then
    /etc/pingwa/pingwa.sh - запускаем твой скрипт
    else exit.

    Ну и убери проверку из скрипта....
  16. 28 Мая 2011 Суб 16:22:05
    Виталька писал :Добавь это в крон

    Отличная идея, только вот немного изменить строку пришлось, а то с -eq 1 не канает, потому что (уж не знаю почему) насчитывает 3 строки по крону...
    Переделал немного:
    Код:
    */1 * * * * root [ $(ps -aef | grep -c pingwa.sh) -ge 4 ] || (/etc/pingwa/pingwa.sh 192.168.80.2&) &>/etc/pingwa/cron
На страницу: Назад  1, 2, 3  Вперёд