Автор Тема: автоматическое переподключение после обрыва связи  (Прочитано 10169 раз)

Оффлайн Rezedent12

  • Участник
  • *
  • Сообщений: 640
  • Цель оправдывает средства.
Цитировать
Опции PPP

Этот раздел повторяет информацию страницы руководства pppd(8).

PPPTYPE
    PPP-подтип. Допустимые типы: dialup, pptp, pppoe. Типы pptp и pptp полезны при правильно установленных переменных REQIURES и HOST соответственно. Подтип dialup добавит 'modem' к списку опций pppd.
PPTP_SERVER
    Для подтипа "pptp" вы должны задать имя хоста или IP-адрес PPtP-сервера, к которому вы подключаетесь. В противном случае остается PPPTYPE=dialup.
HOST
    pppoe-клиенту необходимо имя целевого интерфейса. Вы должны задать его в переменной HOST, create-ppp автоматически создаст правильную опцию pty для pppd. Эта опция обязательна если PPPTYPE=pppoe.
PPPOE
    Опциональный путь pppoe.
PPPOE_EXTRA_OPTIONS
PPTP
    Опциональный путь pptp-клиента.
PPTP_EXTRA_OPTIONS
PPPD
    Опциональное местоположение pppd
PPPOPTIONS
    Дополнительные параметры pppd. Обратите внимание, что файлы интерфейс-специфичных опций заменят PPPOPTIONS из options-ppp, без добавления.
CHAT
    Опциональное местоположение chat
CHATOPTIONS
    Опции chat (таймаут, полнота вывода информации и т.д.)
PPPOPTIONSFILE
PPPINITCHAT
PPPCONNECTCHAT
PPPDISCONNECTCHAT
RESTORE_DEFAULTROUTE
    pppd не сохраняет маршрут по умолчанию. Мы могли бы сохранить и восстановить его с помощью ip-up/ip-down, но эта функция проделает это за нас.
PPPTIMEOUT
    Ваша подключение по PPP не отключаться на большее количество секунд, чем задано в этой опции. /etc/net будет использовать опции pppd lcp-echo-interval и lcp-echo-failure, если эта опция установлена.
Установил ppptimeout равным 2.  Секунды подождать можно. особенно учитывая что ADSL вырубается обычно почти на минуту.

Знайка

  • Гость
Там в другом затык. Настройками PPPoE проблему не решишь. Бились над этим люди, и третий год подправить не могут. Так что не мучайся.
Тем более, ты решаешь не ту проблему, и не совсем понимая, что ты крутишь.

Оффлайн Rezedent12

  • Участник
  • *
  • Сообщений: 640
  • Цель оправдывает средства.
Протестировал сейчас на шлюзе. Вытащил шнур (телефонный) пинги перестали проходить, через 30 секунд вставил, немного подождал и пинги пошли опять.
Или я не совсем понял тему?

Знайка

  • Гость
Именно.
У вас не верные предпосылки в самом первом посте топика.
И для параметра ppptimeout дайте точную формулировку, а то после перевода, смысл совершенно потерян.
« Последнее редактирование: 22.10.2011 18:25:03 от Знайка »

Оффлайн Rezedent12

  • Участник
  • *
  • Сообщений: 640
  • Цель оправдывает средства.
Именно.
У вас не верные предпосылки в самом первом посте топика.
И для параметра ppptimeout дайте точную формулировку, а то после перевода, смысл совершенно потерян.
PPPTIMEOUT= количество секунд перед попыткой переподключения.

Знайка

  • Гость
А вы внимательно прочитали багу, ссылку тут давали.
Особое внимание обратите на 15й ответ, и все с ним связанное.
А также на обсуждение maxfail. Там прекрасно объяснено, почему этот параметр по барабану. По этой же причине в лес идет и PPPTIMEOUT

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

Оффлайн Rezedent12

  • Участник
  • *
  • Сообщений: 640
  • Цель оправдывает средства.
хм.. могу предложить вот что:
/usr/local/bin/auto-reconect-adsl
#!/bin/bash

ifup ppp1
while [ 1 ]; do
#Бесконечный цикл начало

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin

adapters=$(ifconfig | grep ppp1)
status=${adapters:0:4}

if [ "$status" != "ppp1" ]
then
#pon vpn
times=$(date)
sleep 5
linkip=$(ifconfig | grep 255.255.255.255)
echo "Link $status reconnect $times" >> /var/log/adsl
echo "New   $linkip" >> /var/log/adsl
echo "---" >> /var/log/adsl

fi

done
#бесконечный цикл закрытие

/usr/local/bin/stop-adsl
#!/bin/bash
killall auto-reconect-adsl
ifdown ppp1
Где ppp1 это PPPoE интерфейс.

Оффлайн asket

  • Участник
  • *
  • Сообщений: 355
  • просто пользователь..
У меня уже год крутится вот это чудо - пингует яндекс (а при желании пинговать можно что угодно), при потере пинга сначала смотрит есть ли соединение или нет (вдруг "залипло")- если есть -убивает, после чего переподключает. После попытки подключения снова пингует. Если с нескольких попыток не завелось- делает таймаут в три минуты на перекур. Если появилась ошибка "connection limit exceeded" (есть у Ростелекомовского АДСЛ дурная привычка- не подключать, но коннекты накапливать) -ждет 3 минуты на их сброс. И все это логгирует, естественно.
#!/bin/bash
host=yandex.ru
selfname="pinger"
selfpath="/etc/pinger"
logfil="$selfpath/$selfname.log" #сюда бум писать события онлайн/оффлайн
threshold=2 # Порог, выше которого считаем что хост online
statfil="$selfpath/old-state-"$host #Файл, где хранится предыдущее состояние хоста

#подсчитаем количество аналогичных процессов:
ccnt=$( ps ax | grep -v grep | grep -c pinger.sh )
if [ $ccnt -ge 3 ]; then #если процессов и так шибко много, завершаемся
   msg="Скрипт уже запущен!"
   echo $(date) $msg >>$logfil
   exit 0
fi
errors=0
cycles=1
if [ "$1" == "auto" ]; then
     msg="Скрипт перезапущен автоматически."
else
     msg="Скрипт запущен. Проверяемый хост-  $host"
fi
echo $(date) $msg >>$logfil

# Пинговалка. пингует яндекс и возвращает состояние связи в переменную stat

function pinger() {
count=0
for i in {1..5}
do
   ping -c1 -w1 $host &>/dev/null
   if [ $? -eq 0 ]; then # посчитаем кол-во успешных пингов
      count=$(($count + 1))
   fi
done
if [ "$count" -ge "$threshold" ]; then
    stat=1
    tries=0
else
    stat=0
fi
}

#функция тупо задает таймаут в 3 минуты для сброса всех подключений и делает запись в лог
function err_exceed() {
   killall pppd
   echo $(date) "Ошибка - превышено количество попыток подключения(conn limit exceeded). Таймаут 3 минуты" >>$logfil
   sleep 180
   errors=$(($errors+ 1))
   tries=0
}
#функция прекращает попытки подключиться, если нет соединения после определенного количества попыток, и приостанавливает скрипт на 5 минут с записью в лог
function err_noconn() {
   killall pppd
   echo $(date) "Ошибка - слишком много неудачных попыток подключения. Таймаут 3 минуты " >> $logfil
   sleep 180
   tries=0
}


function reconn() {
 let "conn_count=$(ip link | grep -c ppp) / 2"
 if [ $conn_count -eq 0 ]; then
    ifup ppp1
    sleep 5
else
    killall pppd
    ifup ppp1
    sleep 5
fi
tries=$(($tries+ 1))
}

function checker() {
if [ $tries -ge 5 ]; then
    err_noconn
fi
if [ $(tail -100 /var/log/messages | grep -c "limit exceeded") -ge 1 ]; then
    err_exceeded
fi
if [ $errors -ge 10 ]; then
   echo $(date) "ВИМАНИЕ! Слишком много ошибок, работа скрипта остановлена. Проверьте работу системы, после чего перезапустите скрипт"
   sleep 9000000000000
fi
if [ $cycles -ge 720000 ]; then
    echo $(date) "Сервисное сообщение -скрипт работает в штатном режиме" >> $logfil
    cycles=1
fi
}

pinger
oldstat=$stat

while true
do

pinger

if [ $stat -eq 0 ]; then
    if [ "$stat" -ne "$oldstat" ];then
        echo $(date) "Связь потеряна" >> $logfil
    fi
    reconn
fi
if [ $stat -eq 1 ] && [ "$stat" -ne "$oldstat" ]; then
   echo $(date)   "Связь восстановлена" >> $logfil
fi
oldstat=$stat
cycles=$(($cycles+ 1))
checker
есть еще небольшая приблуда для поддержания его всегда живым, но этот костыль уж каждый лепит на свой вкус.
« Последнее редактирование: 29.10.2011 09:26:49 от asket »

Оффлайн Rezedent12

  • Участник
  • *
  • Сообщений: 640
  • Цель оправдывает средства.
есть еще небольшая приблуда для поддержания его всегда живым, но этот костыль уж каждый лепит на свой вкус.
хм.. как я понял ваш скрипт смотрит количество своих клонов. Зачем же делать его рекурсивным?

Оффлайн asket

  • Участник
  • *
  • Сообщений: 355
  • просто пользователь..
Если перезапуск делать через него самого- в логах останется запись о превышении лимита запущеных копий.
Лично у меня наличие запущенных копий скрипта проверяет другой скрипт по крону, и при отстутсвиии скрипта в процессах- запускает его.

Оффлайн Rezedent12

  • Участник
  • *
  • Сообщений: 640
  • Цель оправдывает средства.
Не кажется ли вам что бесконечный цикл более элегантное решение чем рекурсия и счётчик процессов...

Оффлайн asket

  • Участник
  • *
  • Сообщений: 355
  • просто пользователь..
Так вопрос в чем- если сам процесс скрипта будет убит, то он себя перезапустить не сможет, логично?  Поэтому то, жив процесс или нет проверяет время от времени запускаемый по крону скрипт, который после проверки завершается.
 И если Вы не обратили внимание- в моем скрипте точно так же все завязано на бесконечном цикле.