Как автоматически перезванивать провайдеру 23.11.1999
Итак, мы получили PPP-соединение.
Но в случае обрыва модемного соединения pppd завершает работу
и интерфейс ppp0 вернётся в прежнее состояние.
В принципе, можно написать скрипт, который бы в случае обрыва
соединения запускал pppd снова:
#!/bin/sh
DEVICE=cuaa0
while [ ! -f /var/spool/lock/LCK..${DEVICE} ]; do
pppd ${DEVICE} 57600 lock \
connect '/etc/ppp/dial' \
defaultroute noipdefault debug
sleep 5
done
Этот скрипт каждые пять секунд проверяет наличие
файла блокирования (в нашем случае, это
/var/spool/lock/LCK..cuaa0) и, в случае его отсутствия,
запускает pppd снова.
Но, на самом деле, достаточно указать pppd
параметр persist, что бы он делал это сам:
pppd cuaa0 57600 lock connect '/etc/ppp/dial' \
persist holdoff 5 \
defaultroute noipdefault debug
При разрыве соединения pppd возвращает интерфейс
ppp0 в первоначальное неактивное состояние,
то есть, интерфейс лишается адреса и удаляются все пути, в том числе и
default route, проходящие через этот интерфейс.
Но pppd не выходит, а пытается соединиться снова через пять
секунд после разрыва соединения
(параметр holdoff 5).pppd будет пытаться соединиться снова и
снова до тех пор, пока его не прибьют
kill `cat /var/run/ppp0.pid`
Отметим, что для прибивания pppd
в режиме persist
недостаточно послать сигнал HUP (hang up),
поскольку pppd будет пытаться звонить снова.
В версии pppd, которая идёт в составе
FreeBSD 2.2.7-4.x, есть
параметр connect-max-attempts N,
который позволяет ограничить число попыток дозвониться.
Надо заметить, что у pppd есть параметр
idle N, обычно используемый
в режиме demand.
Это параметр указывает pppd прервать соединение,
если в течение N секунд по линии
ничего не передавалось.
Однако, в режиме persist этот параметр не имеет смысла,
поскольку после разрыва соединения, вызванного бездействием линии,
pppd будет пытаться соединиться снова.
Но иногда такое поведение нежелательно то
есть, хотелось бы воспользоваться режимом persist,
но при этом завершать работу pppd не с помощью
команды kill, а чтобы он это делал сам после некоторого
промежутка времени неактивности линии, заданного параметром
idle.
Добиться этого поможет патч.
(C) Игорь Сысоев http://sysoev.ru |