добрый день
на перле через use Socket парсю сайт через крон
если соединение обрывается, скрипт тупо виснет в ожиданиях чуда, а потом за ним запускается следующий скрипт (по крону), итого висит уже 2.. 3.. 10..
пробовал connect(SOCK,...)or die; но чё-то не хочет
как правильно его автоматически прибить?
> добрый день
> на перле через use Socket парсю сайт через крон
> если соединение обрывается, скрипт тупо виснет в ожиданиях чуда, а потом за
> ним запускается следующий скрипт (по крону), итого висит уже 2.. 3..
> 10..
> пробовал connect(SOCK,...)or die; но чё-то не хочет
> как правильно его автоматически прибить?Вероятно нужно включить обработку обрыва коннекта в тело получения сообщений а не в начало этой процедуры.
Каким образом принимаются данные?
> Вероятно нужно включить обработку обрыва коннекта в тело получения сообщений а не
> в начало этой процедуры.
> Каким образом принимаются данные?while(<SOCK>){}
$curtime=time(); # перед while
exit if(time() - $curtime > 60); # внутри whileесли прошла минута, выход. так штоле предлагаете?
поизящней нет?
>> Вероятно нужно включить обработку обрыва коннекта в тело получения сообщений а не
>> в начало этой процедуры.
>> Каким образом принимаются данные?
> 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
> конструкция
> while ($newline=<HTTPCMD>){
> print"$newline\n";
> };
> корректно отрабатывает разрыв соединения
> вы уверены что разрыв соединения в действительности имеет место?
> да и при использовании LWP::UserAgent тоже все корректно отрабатывается..
> впрочем.. можно посмотреть как таймаут сделан тут: http://opennet.ru/base/dev/socket_timeout2.txt.htmlне отрабатывает.
разрыв соединения отлично наблюдается по кол-ву одновременно работающих скриптов
хотя скрипт успевает отработать ДО того, как следующий запустится
да я и руками пускал
LWP убог
> LWP убогА в чем именно?
Мне интересно ваше мнение.
>> LWP убог
> А в чем именно?
> Мне интересно ваше мнение.по моим тестам тормознее подключения напрямую
> вы уверены что разрыв соединения в действительности имеет место?
> да и при использовании 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" }
>[оверквотинг удален]
> париться. а то на коннект тайм аут, на каждую операцию чтения.
> а так раз и все.
> 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
}а куда тут сам код программы вставлять?
Где-то вот так: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
> }
> а куда тут сам код программы вставлять?
спасибо, работает
> добрый день
> на перле через use Socket парсю сайт через крон
> если соединение обрывается, скрипт тупо виснет в ожиданиях чуда, а потом за
> ним запускается следующий скрипт (по крону), итого висит уже 2.. 3..
> 10..в crontab
* 10 * * * root killall -9 perlscript.pl; sleep 5; /usr/local/perlscript.pl;