URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8963
[ Назад ]

Исходное сообщение
"прибить perl-скрипт парсинга, если соединение оборвалось"

Отправлено greenwar , 14-Дек-10 13:23 
добрый день
на перле через use Socket парсю сайт через крон
если соединение обрывается, скрипт тупо виснет в ожиданиях чуда, а потом за ним запускается следующий скрипт (по крону), итого висит уже 2.. 3.. 10..
пробовал connect(SOCK,...)or die; но чё-то не хочет
как правильно его автоматически прибить?

Содержание

Сообщения в этом обсуждении
"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено Square , 14-Дек-10 14:20 
> добрый день
> на перле через use Socket парсю сайт через крон
> если соединение обрывается, скрипт тупо виснет в ожиданиях чуда, а потом за
> ним запускается следующий скрипт (по крону), итого висит уже 2.. 3..
> 10..
> пробовал connect(SOCK,...)or die; но чё-то не хочет
> как правильно его автоматически прибить?

Вероятно нужно включить обработку обрыва коннекта в тело получения сообщений а не в начало этой процедуры.
Каким образом принимаются данные?


"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено greenwar , 14-Дек-10 14:56 
> Вероятно нужно включить обработку обрыва коннекта в тело получения сообщений а не
> в начало этой процедуры.
> Каким образом принимаются данные?

while(<SOCK>){}

$curtime=time(); # перед while
exit if(time() - $curtime > 60); # внутри while

если прошла минута, выход. так штоле предлагаете?
поизящней нет?


"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено Square , 14-Дек-10 15:09 
>> Вероятно нужно включить обработку обрыва коннекта в тело получения сообщений а не
>> в начало этой процедуры.
>> Каким образом принимаются данные?
> while(<SOCK>){}
> $curtime=time(); # перед while
> exit if(time() - $curtime > 60); # внутри while
> если прошла минута, выход. так штоле предлагаете?
> поизящней нет?

конструкция
while ($newline=<HTTPCMD>){
print"$newline\n";
};

корректно отрабатывает разрыв соединения

вы уверены что разрыв соединения в действительности имеет место?

да и при использовании LWP::UserAgent тоже все корректно отрабатывается..
впрочем.. можно посмотреть как таймаут сделан тут: http://opennet.ru/base/dev/socket_timeout2.txt.html


"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено greenwar , 14-Дек-10 17:54 
> конструкция
> while ($newline=<HTTPCMD>){
> print"$newline\n";
> };
> корректно отрабатывает разрыв соединения
> вы уверены что разрыв соединения в действительности имеет место?
> да и при использовании LWP::UserAgent тоже все корректно отрабатывается..
> впрочем.. можно посмотреть как таймаут сделан тут: http://opennet.ru/base/dev/socket_timeout2.txt.html

не отрабатывает.
разрыв соединения отлично наблюдается по кол-ву одновременно работающих скриптов
хотя скрипт успевает отработать ДО того, как следующий запустится
да я и руками пускал
LWP убог


"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено Sugar , 30-Дек-10 11:51 
> LWP убог

А в чем именно?
Мне интересно ваше мнение.


"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено greenwar , 30-Дек-10 23:09 
>> LWP убог
> А в чем именно?
> Мне интересно ваше мнение.

по моим тестам тормознее подключения напрямую


"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено NuINu , 14-Дек-10 19:09 
> вы уверены что разрыв соединения в действительности имеет место?
> да и при использовании LWP::UserAgent тоже все корректно отрабатывается..
> впрочем.. можно посмотреть как таймаут сделан тут: http://opennet.ru/base/dev/socket_timeout2.txt.html

там в любом месте может протокол "встать", поэтому вообще рекоменую на всю эту процедуру установить общий тайм аут. и больше о нем не париться. а то на коннект тайм аут, на каждую операцию чтения.

а так раз и все.

   eval {
      local $SIG{ALRM} = sub { die "timeout\n" };
      alarm($timeout); #implement N second time out
      work();
      alarm(0);
    };
    if ( $@ ) { print "execute timed out or error: $@\n" }



"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено greenwar , 14-Дек-10 19:54 
>[оверквотинг удален]
> париться. а то на коннект тайм аут, на каждую операцию чтения.
> а так раз и все.
>    eval {
>       local $SIG{ALRM} = sub { die "timeout\n" };
>       alarm($timeout); #implement N second time out
>       work();
>       alarm(0);
>     };
>     if ( $@ ) { print "execute timed
> out or error: $@\n" }

eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
    alarm $timeout;
    $nread = sysread SOCKET, $buffer, $size;
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n"; # propagate unexpected errors
    # timed out
}
else {
    # didn't
}

а куда тут сам код программы вставлять?


"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено cryo , 15-Дек-10 17:04 
Где-то вот так:

eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
    alarm $timeout;
... ЗДЕСЬ ВСЯ РАБОТА С СОКЕТОМ: ОТКРЫТИЕ, ЧТЕНИЕ, ЗАКРЫТИЕ ...
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n"; # propagate unexpected errors
    # timed out
}
else {
    # didn't
}

>[оверквотинг удален]
> };
> if ($@) {
>     die unless $@ eq "alarm\n"; # propagate unexpected
> errors
>     # timed out
> }
> else {
>     # didn't
> }
> а куда тут сам код программы вставлять?


"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено greenwar , 15-Дек-10 22:40 
спасибо, работает

"прибить perl-скрипт парсинга, если соединение оборвалось"
Отправлено pavlinux , 30-Дек-10 12:25 
> добрый день
> на перле через use Socket парсю сайт через крон
> если соединение обрывается, скрипт тупо виснет в ожиданиях чуда, а потом за
> ним запускается следующий скрипт (по крону), итого висит уже 2.. 3..
> 10..

в crontab

* 10 * * * root killall -9 perlscript.pl; sleep 5; /usr/local/perlscript.pl;