PING из Raspberry с коммандой?

Тема в разделе "Raspberry Pi", создана пользователем Vitalij, 27 июн 2018.

  1. Igor68

    Igor68 Гуру

    Ну ведь Metrandir Вам уже всё дал:
    Код (Bash):

    #!/bin/bash
    ((loop = 1))
    while  ( ((loop > 0)) )
    do
      pd=$(ping -c 1 <тут интересуемый IP>)
      ppd=$(echo $pd | grep "errors" | awk '{print length}')
      if( ((ppd > 1)) )
      then
        #тут вы к одной странице с параметрами
        wget http://<ваш один рессурс> -O-
      else
         #тут вы к другой странице с параметрами
         wget http://<ваш другой рессурс> -O-
      fi
      #тут интервал пинга
      sleep 60
    done
    ключ "-O-" для wget, что бы не было сохранения в файл, а только в консоль.
    Неужели не работает?
     
  2. AlexU

    AlexU Гуру

    Этот метод может не сработать. Не знаю, что за версия 'ping' у пользователя Metrandir. Но обычно вывод команды ping выглядит примерно так:
    Код (Bash):
    PING 10.0.20.1 (10.0.20.1) 56(84) bytes of data.

    --- 10.0.20.1 ping statistics ---
    1 packets transmitted, 0 received, 100% packet loss, time 0ms
     
    Как видно при недоступности хоста ответные пакеты не приходят. При этом ни каких 'errors' нет. Соответственно команды:
    Код (Bash):
    pd=$(ping -c 1 <тут интересуемый IP>)
    ppd=$(echo $pd | grep "errors" | awk '{print length}')
    ничего не вернут и следующее условие не сработает.
     
    Igor68 нравится это.
  3. Mitrandir

    Mitrandir Гуру

    Ну так поменять на 100% packet loss
     
  4. Igor68

    Igor68 Гуру

    Вот это испытано и работает:
    Код (Bash):
    #!/bin/bash

    p1=$1
    ((Connect = 0))

    #параметр - интервал проверки (секунд)
    psleep="10"

    #параметр - команда/URL для удачного пинга
    cmdconnect="http://192.168.0.234"

    #параметр - команда/URL для неудачного пинга
    cmddisconnect="http://192.168.0.246"

    if [ "$p1" == "" ] ; then
        echo "IP addr:"
        read ipurl
    else
        ipurl=$p1
    fi

    # Контроль связи
    function _dev_ping()
    {
        pd=$(ping -c 1 $ipurl)
        ppd=$(echo $pd | grep "errors" | awk '{print length}')
        if( ((ppd > 1)) ) ; then
            echo "no connect"
            ((Connect = 0))
        else
            echo "connect"
            ((Connect = 1))
        fi
    }


    ((loop = 1))
    while( ((loop > 0)) ); do
        _dev_ping
        if( ((Connect == 1)) ); then
            wget $cmdconnect -O-
        else
            wget $cmddisconnect -O-
        fi
        sleep $psleep
    done
     
    только выбрать интервал и команды свои:
    Код (Bash):
    #параметр - интервал проверки (секунд)
    psleep="10"

    #параметр - команда/URL для удачного пинга
    cmdconnect="http://192.168.0.234"

    #параметр - команда/URL для неудачного пинга
    cmddisconnect="http://192.168.0.246"
    Я испытал для разных страниц

    При вводе (с указанным IP):
    Код (Bash):
    ./ping1.sh 192.168.0.230
    Сразу приступит к работе, а при
    Код (Bash):

    kto@debian:~/coding/bash/ping$ ./ping1.sh
    IP addr:

     
    Спросит IP адрес

    Если указать к этому файлу петь в /etc/rc.local (у меня он называется ping1.sh) то запустится при старте малины. Не забудьте про "&" после имени файла для автозапуска.
     
    Последнее редактирование: 28 июн 2018
  5. Vitalij

    Vitalij Нерд

    Привет гуру,

    ping.sh который сделал по вашему примеру:
    Код (Bash):
    #!/bin/bash
    p1=$1
    ((Connect = 0))

    #параметр - интервал проверки (секунд)
    psleep="10"

    #параметр - команда/URL для удачного пинга
    cmdconnect="http://192.168.11.150/trigger/gpiotrigger?gpout=1&wfilter=1"

    #параметр - команда/URL для неудачного пинга
    cmddisconnect="http://192.168.11.150/trigger/gpiotrigger?gpout=0&wfilter=1"

    if [ "$p1" == "" ] ; then
        echo "IP addr:"
        read ipurl
    else
        ipurl=$p1
    fi

    # Контроль связи
    function _dev_ping()
    {
        pd=$(ping -c 1 $ipurl)
        ppd=$(echo $pd | grep "errors" | awk '{print length}')
        if( ((ppd > 1)) ) ; then
            echo "no connect"
            ((Connect = 0))
        else
            echo "connect"
            ((Connect = 1))
        fi
    }


    ((loop = 1))
    while( ((loop > 0)) ); do
        _dev_ping
        if( ((Connect == 1)) ); then
            wget $cmdconnect -O-
        else
            wget $cmddisconnect -O-
        fi
        sleep $psleep
    done
     
    В командной строке запускаю так: bash /etc/ping.sh 192.168.11.102

    Но у меня сразу запускает команду из скрипта:
    Код (Bash):
    cmdconnect="http://192.168.11.150/trigger/gpiotrigger?gpout=1&wfilter=1"
    И все, далее отключаю от сети 192.168.11.102 и подключаю, и никакой реакции.

    Что я не так делаю?
     
  6. Igor68

    Igor68 Гуру

    Вы точно заметили. Если связь появилась... то сам PING продолжает выдавать:
    Код (Bash):
    --- 192.168.0.240 ping statistics ---
    1 packets transmitted, 0 received, 100% packet loss, time 0ms
     
    Хотя при наличии связи давал:
    Код (Bash):
    --- 192.168.0.240 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.863/0.863/0.863/0.000 ms
    А без связи с самого начала:
    Код (Text):
    --- 192.168.0.240 ping statistics ---
    1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
    Но проблема в том, что у каждой версии PING свои сообщения.
    А :
    Код (Bash):
    pd=$(ping -c 1 $ipurl)
        ppd=$(echo $pd | grep "errors" | awk '{print length}')
    Тут опора на слово "errors". Сам ориентируюсь на это. Но прихожу к выводу, что есть строка в ответе:
    Код (Bash):
    rtt min/avg/max/mdev = 0.863/0.863/0.863/0.000 ms
    А вот у другого(на другом устройстве):
    Код (Bash):
    round-trip min/avg/max = 10.1/10.1/10.1 ms
    Ну и делаю предположение, что по содержимому:
    Код (Bash):
    min/avg/max
    Надо производить другой анализ ответа а не "errors", который после удачной связи не появиться... или не скоро.
    Сейчас попробую.
     
    Mitrandir нравится это.
  7. Igor68

    Igor68 Гуру

    Только что поправил!
    Это:
    Код (Bash):
    #!/bin/bash

    p1=$1
    ((Connect = 0))

    #параметр - интервал проверки (секунд)
    psleep="1"

    #параметр - команда/URL для удачного пинга
    cmdconnect="http://192.168.0.234"

    #параметр - команда/URL для неудачного пинга
    cmddisconnect="http://192.168.0.246"

    if [ "$p1" == "" ] ; then
        echo "IP addr:"
        read ipurl
    else
        ipurl=$p1
    fi

    # Контроль связи
    function _dev_ping()
    {
        pd=$(ping -c 1 $ipurl)
        ppd=$(echo $pd | grep "min/avg/max" | awk '{print length}')
        echo "$pd"
        if( ((ppd > 1)) ) ; then
            echo "connect"
            ((Connect = 1))
        else
            echo "no connect"
            ((Connect = 0))
        fi
    }


    ((loop = 1))
    while( ((loop > 0)) ); do
        _dev_ping
        if( ((Connect == 1)) ); then
            wget $cmdconnect -O-
        else
            wget $cmddisconnect -O-
        fi
        sleep $psleep
    done
     
  8. Igor68

    Igor68 Гуру

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

    Vitalij Нерд

    Для уточнения, по скрипту, если успешный пинг он кашдый раз по интервалу обращается по указанному адресу? Или только в момент изменения состояния пинга? Мне надо второй вариант чтобы при нормальной работе не ходил каждый интервал времени по ссылке. А еще круче будет две настройки интервала времени, с пингом и без него, к примеру в нормальных условиях пингует каждые 5мин при потери пинг каждые 5сек, и по ссылке идет только при изменение состояния пинга.
     
  10. Mitrandir

    Mitrandir Гуру

    Ну так ходи по ссылке только когда пинг неуспешен
     
  11. Vitalij

    Vitalij Нерд

    Каким образом?
     
  12. Mitrandir

    Mitrandir Гуру

    Убери строку
    wget$cmdconnect-O-
     
  13. Mitrandir

    Mitrandir Гуру

    Код (Bash):
    ((loop = 1))
    while( ((loop > 0)) ); do
        _dev_ping
        if( ((Connect == 1)) ); then
         
        else
            wget $cmddisconnect -O-
        fi
        sleep $psleep
    done
     
  14. Igor68

    Igor68 Гуру

    Воспользуйтесь флагом(переменной), что уже ходили по этому адресу:
    Код (Bash):
    ((loop = 1))
    while( ((loop > 0)) ); do
        _dev_ping
        if( ((Connect == 1)) ); then
           if( ((flagcon < 1)) ); then
            wget $cmdconnect -O-
            ((flagcon = 1))
            (flagdiscon = 0))
           fi
        else
          if( ((flagdiscon < 1)) ); then
            wget $cmddisconnect -O-
            ((flagdiscon = 1))
            ((flagcon = 0))
          fi
        fi
        sleep $psleep
    done
     
  15. b707

    b707 Гуру

    вот вы ребята заморочились-то. Нафига анализировать текстовой вывод пинга, если у него есть exitcode? Если пинг успешный, он возвращает 0, если ошибки - 1 или 2. Какая ситуация трактуется как "ошибка" смотрите в мануале, там очень подробно - man ping
     
    Vitalij, Igor68 и parovoZZ нравится это.
  16. Vitalij

    Vitalij Нерд

    Как сделать проще? Где данный мануал найти?
     
  17. Igor68

    Igor68 Гуру

    Нравится то оно так... но вот давно в соседней теме искал, точнее ждал ответа... аж два года как... и ни слуху ни духу. А тут такое! И как? получить именно exitcode? Опыта нет именно в этой теме.
    Спасибо заранее!
     
  18. Igor68

    Igor68 Гуру

    Но спасибо!!!! Работает!!!!!
    Респект b707:):):):):):). Простите, но второй плюсик на ваше сообщение поставить невозможно! Сейчас Изменю... и выложу!
     
  19. Igor68

    Igor68 Гуру

    Код (Bash):
    #!/bin/bash

    p1=$1
    ((Connect = 0))

    #параметр - интервал проверки (секунд)
    psleep="1"

    #параметр - команда/URL для удачного пинга
    cmdconnect="http://192.168.0.234"
    ((flagconnect = 0))

    #параметр - команда/URL для неудачного пинга
    cmddisconnect="http://192.168.0.246"
    ((flagdisconnect = 0))

    if [ "$p1" == "" ] ; then
        echo "IP addr:"
        read ipurl
    else
        ipurl=$p1
    fi

    # Контроль связи
    function _dev_ping()
    {
        ping -c 1 $ipurl 2>&1>/dev/null
        ret=$?
        if [ ${ret} -eq 0 ] ; then
            echo "connect"
            ((Connect = 1))
        else
            echo "no connect"
            ((Connect = 0))
        fi
    }

    #рабочий цикл проверки и разового вызова
    ((loop = 1))
    while( ((loop > 0)) ); do
        _dev_ping
        if( ((Connect == 1)) ); then
            if ( ((flagconnect < 1)) ); then
                wget $cmdconnect -O-
                ((flagconnect = 1))
                ((flagdisconnect = 0))
            fi
        else
            if( ((flagdisconnect < 1)) ); then
                wget $cmddisconnect -O-
                ((flagdisconnect = 1))
                ((flagconnect = 0))
            fi
        fi
        sleep $psleep
    done

     
    Страница (команда) вызывается единыжды... только при изменении состояния пинга
     
    Mitrandir нравится это.
  20. b707

    b707 Гуру

    Они в линуксе уже установлены. В консоли так и набираете man ping.
     
    Igor68 нравится это.