LINUX.ORG.RU
ФорумAdmin

Проверка подключения


0

0

Ситуация такая. На машине необходимо постоянное подключение к Интернет, для этого используется GPRS. Но проблема в том, что GPRS периодически подвисает по непонятным причинам (скорее всего у провайдера). Т.е. соединение вроде бы активно, но данные не передаются. Далее чтобы все заработало нужно отключиться и заново подключиться.
Собственно, хочу написать скрипт на баше, запускаемый Cron'ом, скажем, каждые 10 минут, и проверяющий соединение. Если подвисло - перезапускающий его.
Вопрос: каким образом можно проверить, работает ли сеть? Т.е. грубо говоря нужно пинговать какой-нибудь удаленный сервер, но как тогда результаты обрабатывать в скрипте?
В общем, прошу совета.

anonymous

парсить выхлоп, например, ping -q -c 5 <host> ? как вариант, можно пробовать открывать 80-ый порт например у гугла.

isden ★★★★★
()
Ответ на: комментарий от isden

Зачем парсить? Используй код возврата ping:

http://www.livefirelabs.com/unix_tip_trick_shell_script/june_2003/06162003.htm

В скрипте придумай логику, например пингуеш одним пакетом с некоторым периодом, при возникновении ошибки пингуеш меньшим периодом несколько раз подряд, если все попытки неудачные - выполнение нужного действия.

capricorn20
()

Это не поможет? man pppd:

lcp-echo-failure n If this option is given, pppd will presume the peer to be dead if n LCP echo-requests are sent without receiving a valid LCP echo-reply. If this happens, pppd will terminate the connection. Use of this option requires a non-zero value for the lcp-echo-interval param- eter. This option can be used to enable pppd to terminate after the physical connection has been broken (e.g., the modem has hung up) in situations where no hardware modem con- trol lines are available.

lcp-echo-interval n If this option is given, pppd will send an LCP echo-request frame to the peer every n sec- onds. Normally the peer should respond to the echo-request by sending an echo-reply. This option can be used with the lcp-echo-failure option to detect that the peer is no longer connected.

qwe ★★★
()

2capricorn20: спасибо, то что нужно!

qwe: к сожалению не то, т.к. во время подвисания система, в т.ч. и pppd "не знают", что все подвисло - просто прекращается обмен данными.

anonymous
()
Ответ на: комментарий от anonymous

>pppd "не знают", что все подвисло

Ну так скорее всего и не знает потому что нет обмена LCP кадрами, корректный отбой с той стороны не пришёл, а среда передачи (GPRS) существует.

В принципе можно сделать и костыль - положить в /etc/ppp скриптик ip-up примерно следуюшего содержания:

8<----------------------------------------------------
#!/bin/bash

# Создаём фоновый просесс проверяющий удалённый IP
(

# Ждем 30 секунд (интерфейс может быть ещё не поднят)
sleep 30

# Посылаем 3 ICMP пакета нулевой длины на удалённый IP
# если в течение 15-ти секунд ни один пакет
# не прошёл, выходим из цикла
while ping -s 0 -c 3 -W 15 $IPREMOTE
do
# Спим 15-ть секунд и опять проверяем
  sleep 15
done

# ICMP пакеты не прошли убиваем pppd
kill `cat /var/run/$IFNAME.pid`
# Следующей строчкой можно опять запустить pppd
) &

8<-----------------------------------------------------

Скрипт не проверял. Относительно имен переменных загляните
в man pppd. На крайняк можете направить вывод в файл и
посмотреть переменные там.

qwe ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.