Реконнект при помощи kppp

Материал из Lblss.ru
Перейти к: навигация, поиск

Проблема

Устанавливаю соединение с инетом при помощи kppp. Все нормально. Однако, в какой то момент прекращается обмен данными. Коннект есть, ошибок нет. После повторного подключения ручками, как правило, усе опять работает. Ручками реконнектить лениво. Особенно, когда меня нет дома или сплю.

Собственно, проблемка то нарисовалась давно, когда еще модемом работал мобильник Siemens C55. Сейчас модем Huawei E220, однако, смена девайса не решила проблему. Похоже на какие то "особенности" оператора сотовой связи или базовой станции.

UPD: Для меня лично этот скрипт утратил актуальность довольно быстро, так как теперь ppp-соединение поддерживает init. Однако, через какое то время оператор сотовой связи стал чудить по новому :-(

Решение

Скриптик на шелл, сохранен как ~/bin/inet.sh. Пока первые рабочие наброски.

#!/bin/sh
 
# запускать бум по крону раз в иногда, при загрузке компа да на случай, если срубиццо
# */5 * * * * ~/bin/inet.sh 1>>~/inet.log 2>&1
# вывод в лог для отладки
 
# хосты для теста
testhost1="ya.ru"
testhost2="news.kraft-s.ru"
# модем
#dev_modem="/dev/ttyUSB0"
# не... лучше так, потому как он периодически "плавает"... при случае следует порыться в udev
dev_modem="/dev/"`ls /dev | grep ttyUSB | sed '1!d'`
 
# не факт что нет лишних путей, скопипейстил тупо
PATH="/home/vk/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin:/usr/games:/usr/X11R6/bin"
# при запуске из крона нужно таки определить X-сервер, тож скопипейстил
DISPLAY=":0.0"
 
echo
echo `date`" ============== Старт скрипта =============="
# если есть запущенный экземпляр скрипта
if [ 3 -lt `ps ax | grep "/bin/sh.*inet.sh" | grep -v grep | wc -l` ]
then # то выход
  echo "Скрипт уже запущен, бай."
  exit 0
fi
 
# если нет запущенного kppp
if [ 0 -eq `ps x | grep kppp | grep -v grep | wc -l` ]
then # то запускаем
  echo `date`" Запускаем kppp..."
  kppp --display $DISPLAY -c mobilko -m e220_mega --dev $dev_modem &
  sleep 15
else
  echo `date`" kppp уже был запущен ранее, продолжаем"
fi
 
# проверка связи
# 6 попыток через 15 секунд (с таймаутом - через 30)
numbers=0 # счетчик неудачных попыток
while [ 6 -gt $numbers ]
do
  sleep 15
  # он еще не помер?
  if [ 0 -eq `ps x | grep kppp | grep -v grep | wc -l` ]
  then
    echo `date`" ======== Уйбля, kppp потерялсо... =========="
    exit 0
  fi
  # теперь пиннем контрольные хосты
  # первый
  if [[ 1 -eq `host $testhost1 2>/dev/null | grep "timed out" | wc -l` ]]
  then
    res1=1
  else
    res1=`ping -c 1 $testhost1 2>/dev/null | grep "100% packet loss" | wc -l`
  fi
  # второй
  if [[ 1 -eq `host $testhost2 2>/dev/null | grep "timed out" | wc -l` ]]
  then
    res2=1
  else
    res2=`ping -c 1 $testhost2 2>/dev/null | grep "100% packet loss" | wc -l`
  fi
  # сумма
  (( res=$res1+$res2 ))
  # счет
  if [[ 2 -eq $res ]]
  then
    (( numbers++ ))
  else
    numbers=0 # сброс счетчика
  fi
  echo `date`" Обломов: $numbers"
done
 
echo `date`" Отрубаем kppp"
kppp --display $DISPLAY -k 2>/dev/null &
sleep 30
 
# если что то осталось
while [  0 -lt `ps ax | grep kppp | grep -v grep | wc -l` ]
do
  kill -9 `ps ax | grep kppp | grep -v grep | awk '{print $1}'`
done
 
echo `date`" ========== Конец скрипта ============"
exit 0

Ссылки

[1] - решение проблемы с подключением к иксам из скрипта, запущенного не в контексте X-сессии

Персональные инструменты