LINUX.ORG.RU
ФорумAdmin

Отваливается USB модем

 


0

1

Здравствуйте. CentOS7 установлен на VirtualBox для поднятия мобильных прокси. Переодически отваливается USB модем. Мне подсказали, что исправить проблему можно модифицировав скрипт, добавив код который в случае исчезновения пингов запускает скрипт для ребута соединения и поднятия прокси повторно. Скрипт запускается из Zennoposter, поэтому в крон его ставить нельзя. Нужно в самом скрипте прописать проверку модема(отвалился или нет), если отвалилися, то восстановить соединение и только после этого будет включаться остальной код. Не силен в bash. Подскажите пожалуйста как написать такую проверку.

Вот так выглядит скрипт, который я запускаю по SSH:

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
echo -e "AT^RESET\r\n" >/dev/ttyUSB1
killall 3proxy
sleep 20
echo -en 'AT^NDISDUP=1,1,"internet"\r\n' > /dev/ttyUSB1
ifdown wwp0s6u1i2
ifup wwp0s6u1i2
IP=`ip addr list wwp0s6u1i2 | grep " inet " | head -n 1 | cut -d " " -f 6 | cut -d / -f 1`
echo "" > /usr/local/3proxy/3proxy.cfg
cat > /usr/local/3proxy/3proxy.cfg << END
monitor /usr/local/3proxy/3proxy.cfg

daemon
timeouts 1 5 30 60 180 1800 15 60
maxconn 5000
nscache 65535
log /dev/null
flush
proxy -n -a -p8000 -i192.168.0.104 -e$IP
END
/usr/local/3proxy/3proxy /usr/local/3proxy/3proxy.cfg

если Вам бесконечно будут помогать команды
echo -e «AT^RESET\r\n» >/dev/ttyUSB1
echo -en 'AT^NDISDUP=1,1,«internet»\r\n' > /dev/ttyUSB1

буду рад за Вас

Vlad-76 ★★★ ()
#!/bin/bash

RESULT=`ping -c 5 8.8.8.8 | awk '/loss/{print $6}' | sed 's/%//'`

if [ "$RESULT" = "0" ]
    then
        echo "ping SUCCESS"
    else
        echo "ping FAILED"
# в это место вставьте вызов вашего скрипта
fi

Проверка примитивна, если 8.8.8.8 закроет ICMP то нужно будет подбирать IP из инета который более стабилен.

Vlad-76 ★★★ ()
Последнее исправление: Vlad-76 (всего исправлений: 2)
Ответ на: комментарий от Vlad-76

Мне не нужно подбирать IP из инета. Нужно использовать именно белый IP моего модема. Мне кажется что в вашем коде перепутана логика. Если пингуется, то должно происходить включение моего скрипта, а если нет - то мне нужно перезагрузить USB Интерфейсы. Как это сделать?

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

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

#!/bin/bash

RESULT=`ping -c 5 8.8.8.8 | awk '/loss/{print $6}' | sed 's/%//'`

if [ "$RESULT" = "0" ]
    then
        echo "ping SUCCESS"
        # в это место вставьте вызов вашего скрипта
    else
        echo "ping FAILED"
fi

Vlad-76 ★★★ ()
Последнее исправление: Vlad-76 (всего исправлений: 1)
Ответ на: комментарий от Hideyoshi

Т.е. если локальный IP пингуется и все хорошо, то для чего запускать Ваш скрипт?

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

FYI Меня тут не так давно поправили и я проверил. Похоже что раньше ping при одной потере в -с$COUNT возвращал errcode != 0. Я тогда накостылял отдельную функцию. Но сейчас действительно все работает и в простом варианте.
Но ваш вариант неправилен в любом случае вы ищите loss.
1. Если один из пяти пакетов потерян, то считаете что каналу кирдык. Это не правильно, несколько(но не все) могли и потеряться.
2. Грепать по loss тоже неверно, а вдруг там какой-нибудь другой язык в ос, и вместо loss будет другое слово?

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

самого начала подумал что можно по ошибке ping както сделать проверку. но не стал копать. написал по быстрому что должно работать 100%.показать так сказать пример как делать проверку по команде ping
проверку по одному IP вообще не правильно делать(его может вдруг не быть), тут нужно думать как делать проверку по нескольким IP и принимать решение на основе результатов нескольких ping что усложняет скрипт и придется придумывать варианты
один, два пинг потеряны - это уже снова варианты.
в разных linux разные ping со своим выводом? ну и ладно, скрипт то под конкретную систему, можно и руками поправить.
ping Вы говорите тоже может иметь разное поведение с точки зрения возврата кода ошибки.
Можно опрашивать модем на предмет его статуса подключения к провайдеру, уровня сигнала и т.д. пинги могут потеряться в сети провайдера к которому цепляется модем - это не обязательно сбой модема(Переодически отваливается USB модем.).
usb модемы у самого крови попили, бывает так зависнет, что сервер приходиться ребутать.
ладно, это уже все бла бла бла

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

самого начала подумал что можно по ошибке ping както сделать проверку. но не стал копать.

Почему? «Пять» минут на проверку и профит.

проверку по команде ping проверку по одному IP вообще не правильно делать(его может вдруг не быть)

Верно, просто выносим в отдельную функцию.

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

Только на уровне предположения, что когда-то сильно давно, было по другому. Свою функцию написал ооочень много лет назад. Емнип тогда поведение было от обратного, одна потеря exitcode != 0. Сейчас правильно по моему мнению, один ответ exitcode == 0.
Итого это скорее историческое, не имеющее отношения к современным системам (проверял на разных, все работает правильно).

Можно опрашивать модем ... это уже все бла бла бла

Да. Мы говорили только про ваш скрипт. Про мопеды и их сброс тема отдельная.

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

А что если соединение обоврется в последний момент, и loss будет как раз на последним пакете. То получается пинг один хрен вернет err=0 ? Но это же не верно.

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

Значит при следующем старте скрипта, все отработает как надо.
Иначе какой смысл в count 5 ? Мы же не знаем почему последний не пролетел. С таким же успехом мог не пролететь и первый и второй... Так что как раз тут логика верная, ну потерялись какие-то пакеты, но хоть один да пролетел, значит «не все так плохо».

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