LinuxForum.Fans
Тема

Рестарт xl2tpd, скрипты

Автор: Cewrio 24 сообщений 4096 просмотров
#297425

Не очень мне понравилось, что ppp0 при включении сервера поднимается не всегда. Последствия разрывов тоже представляются не очень то хорошими.
На сколько я понял, для решения проблемы нужен скрипт, который будет пинать xl2tpd в случае, когда тот повиснет мертвым грузом.
На просторах интернета был найден следующий вариант:

#!/usr/bin/perl -w
use File::Copy;
use Net::Ping;
use POSIX ();
my $date = POSIX::strftime('%y.%m.%d %H.%M.%S', localtime);
my $pidfile = "/var/run/xl2tpd.pid";
my $log = "/var/log/ping.log";
my $size = (-s $log);
my $max = "1024";
open (FH1, ">> $log");
my $ip = '8.8.8.8';
my $p = Net::Ping->new( "icmp", 5, 64 );
if ( $p->ping($ip) ) {
} else {
if( -e($pidfile) && -T _)
{
system (`/etc/init.d/xl2tpd restart`);
print FH1 "$date ping NO L2TP restart", "\n";
}
else
{
system (`/etc/init.d/xl2tpd start`);
print FH1 "$date ping NO L2TP start", "\n";
}
}
close (FH1);

Может быть есть и лучше - не знаю, предложите другие.
А пока этот отправился в nano /etc/init.d/check-inet
Получил права на выполнение chmod +x /etc/init.d/check-inet
И его адрес был записан мною в nano /etc/rc.local
/etc/init.d/check-inet перед строчкой exit 0

Но на сколько я понял, /etc/rc.local одноразово выполнит скрипт при загрузке системы. Хотел бы непрерывный ход проверки, пускай интернет поднимается сам, что бы ни случилось.
Cron раз в минуту выполнит - не чаще? Ожидать после разрыва столько - не то хотелось бы.

#297427

Скрипт мой. Поставьте в крон делов то.
Меня спасает.

#297432

Крон пугает отсутствием возможности настроить время в секундах

#297436
text
apt-get install  libproc-daemon-perl libproc-pid-file-perl
text
#!/usr/bin/perl

use strict; use warnings;

use Proc::Daemon; use Proc::PID::File; use Net::Ping;

my $pidfile = "/var/run/xl2tpd.pid"; my $ip = '8.8.8.8'; my $p = Net::Ping->new( "icmp", 2, 64 );

Proc::Daemon::Init();

if (Proc::PID::File->running()) { print "Already running\n"; exit 0; }

for (;;) { sleep 15; if ( $p->ping($ip) ) { } else { if( -e($pidfile) && -T _) { system (`/etc/init.d/xl2tpd restart`); } else { system (`/etc/init.d/xl2tpd start`); } } }

Надо проверять.

#297489

То есть как мне это все организовывать?

В /etc/crontab добавляю строчку:
01 * * * * root run-parts /etc/init.d/check-inet

не забыв выставить права на выполнение:
chmod +x /etc/init.d/check-inet

скрипт запустится через минуту, но сам принудит себя выполняться через sleep 15 секунд?

#297490

Я ща на работе отлажу и проверю.
Стоит 1 раз запустить и всё.

#297491

И как проверять? Смотреть в файле лога крона даты, частоту выполнения?

#297493

что проверять? Работает скрипт или нет?

#297494

Почти одновременно отправили сообщения.

Отладьте пожалуйста, этим вы мне поможете. Этот скриптовый язык я совсем не знаю.

#297495

Щас отлаживаю.

#297503
text
root@marshrutizator:~# ls /var/run/ | grep 1.pl
1.pl.pid
root@marshrutizator:~# cat 1.pl
#!/usr/bin/perl
use strict;
use warnings;

use Proc::Daemon; use Proc::PID::File; use Net::Ping;

Proc::Daemon::Init;

if (Proc::PID::File->running()) { print "Already running\n"; exit 0; }

my $pidfile = "/var/run/xl2tpd.pid"; my $ip = '8.8.8.8'; my $p = Net::Ping->new( "icmp", 2, 64 );

my $continue = 1; $SIG{TERM} = sub { $continue = 0 };

while ($continue) {

if ( $p->ping($ip) ) { } else { if( -e($pidfile) && -T _) { system (`/etc/init.d/xl2tpd restart`); } else { system (`/etc/init.d/xl2tpd start`); } } sleep (16); } root@marshrutizator:~# ls /var/run/ | grep 1.pl 1.pl.pid root@marshrutizator:~#

#297505

У меня xl2tpd автоматически реконнектится каждые пять секунд в случае разрыва. Причем запускаю его стандартным гентушным инит-скриптом.

#297506
bobr написал:
У меня xl2tpd автоматически реконнектится каждые пять секунд в случае разрыва. Причем запускаю его стандартным гентушным инит-скриптом.

Но если долгое время не отвечает впн сервер то не поднимается.

#297515
Kettler написал:
[quote=bobr]У меня xl2tpd автоматически реконнектится каждые пять секунд в случае разрыва. Причем запускаю его стандартным гентушным инит-скриптом.

Но если долгое время не отвечает впн сервер то не поднимается.[/quote]
Возможно, это зависит от провайдера, потому что УМВР.

#297517

Создал /var/run/1.pl с правами на выполнение и записал в него тело скрипта.
В /etc/crontab поместил строку 01 * * * * root run-parts /var/run/1.pl
Сделал ребут.

Я правильно понял, что скрипт после первого выполнения зацикливается, а кусок с рестартом xl2tpd выполняется, когда прервется пинг на 8.8.8.8, после чего происходит задержка 16 секунд и скрипт выполняется по новой?

#297518

Выдернул провод на 20 секунд, но рестарта xl2tpd судя по всему не произошло, т.к. ip не поменялся.

#297527

И в логе крона /var/log/cron.log

Jan 21 11:17:01 debian /USR/SBIN/CRON[1776]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jan 21 11:21:47 debian /usr/sbin/cron[1071]: (CRON) INFO (pidfile fd = 3)
Jan 21 11:21:47 debian /usr/sbin/cron[1072]: (CRON) STARTUP (fork ok)
Jan 21 11:21:47 debian /usr/sbin/cron[1072]: (CRON) INFO (Running @reboot jobs)

нет ничего похожего на выполнение /var/run/1.pl

#297529

На сколько я понял, тут /var/run/ файлы долго не живут, так что перекочевал обратно в /etc/init.d/

Но крон от чего то не хочет его выполнять.



crontab -e -u root

01 * * * * /etc/init.d/1.pl

Тоже самое.

#297540

crontab -e -u root
01 * * * * echo "cron работает" > /tmp/cron_test.txt

файл не создался. ощущение что крон вообще не работает.

если ваш скрипт зациклен, может для его запуска крон и не нужен? поместить адрес в /etc/rc.local и запустится при старте системы, так и будет выполняться безконечно?

#297557

например

text
nano /etc/init.d/rec_xl2tpd.pl

туды

text
#!/usr/bin/perl
use strict;
use warnings;

use Proc::Daemon; use Proc::PID::File; use Net::Ping;

Proc::Daemon::Init;

if (Proc::PID::File->running()) { print "Already running\n"; exit 0; }

my $pidfile = "/var/run/xl2tpd.pid"; my $ip = '8.8.8.8'; my $p = Net::Ping->new( "icmp", 2, 64 );

my $continue = 1; $SIG{TERM} = sub { $continue = 0 };

while ($continue) {

if ( $p->ping($ip) ) { } else { if( -e($pidfile) && -T _) { system (`/etc/init.d/xl2tpd restart`); } else { system (`/etc/init.d/xl2tpd start`); } } sleep (16); }

text
chmod +x /etc/init.d/rec_xl2tpd.pl

Запусти вручную

text
./etc/init.d/rec_xl2tpd.pl

После

text
ls /var/run/ | grep .pl

Вывод должен быть не пустой.

После пробуй выдёргивать кабель.

Войдите или зарегистрируйтесь, чтобы ответить.