Ну ведь 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, что бы не было сохранения в файл, а только в консоль. Неужели не работает?
Этот метод может не сработать. Не знаю, что за версия '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}') ничего не вернут и следующее условие не сработает.
Вот это испытано и работает: Код (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) то запустится при старте малины. Не забудьте про "&" после имени файла для автозапуска.
Привет гуру, 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 и подключаю, и никакой реакции. Что я не так делаю?
Вы точно заметили. Если связь появилась... то сам 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", который после удачной связи не появиться... или не скоро. Сейчас попробую.
Только что поправил! Это: Код (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
Для уточнения, по скрипту, если успешный пинг он кашдый раз по интервалу обращается по указанному адресу? Или только в момент изменения состояния пинга? Мне надо второй вариант чтобы при нормальной работе не ходил каждый интервал времени по ссылке. А еще круче будет две настройки интервала времени, с пингом и без него, к примеру в нормальных условиях пингует каждые 5мин при потери пинг каждые 5сек, и по ссылке идет только при изменение состояния пинга.
Код (Bash): ((loop = 1)) while( ((loop > 0)) ); do _dev_ping if( ((Connect == 1)) ); then else wget $cmddisconnect -O- fi sleep $psleep done
Воспользуйтесь флагом(переменной), что уже ходили по этому адресу: Код (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
вот вы ребята заморочились-то. Нафига анализировать текстовой вывод пинга, если у него есть exitcode? Если пинг успешный, он возвращает 0, если ошибки - 1 или 2. Какая ситуация трактуется как "ошибка" смотрите в мануале, там очень подробно - man ping
Нравится то оно так... но вот давно в соседней теме искал, точнее ждал ответа... аж два года как... и ни слуху ни духу. А тут такое! И как? получить именно exitcode? Опыта нет именно в этой теме. Спасибо заранее!
Но спасибо!!!! Работает!!!!! Респект b707. Простите, но второй плюсик на ваше сообщение поставить невозможно! Сейчас Изменю... и выложу!
Код (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 Страница (команда) вызывается единыжды... только при изменении состояния пинга