The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"прибить perl-скрипт парсинга, если соединение оборвалось"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

while(<SOCK>){}

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "прибить perl-скрипт парсинга, если соединение оборвалось"  +/
Сообщение от Square (ok) on 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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

9. "прибить perl-скрипт парсинга, если соединение оборвалось"  +/
Сообщение от Sugar (ok) on 30-Дек-10, 11:51 
> LWP убог

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

11. "прибить perl-скрипт парсинга, если соединение оборвалось"  +/
Сообщение от greenwar (ok) on 30-Дек-10, 23:09 
>> LWP убог
> А в чем именно?
> Мне интересно ваше мнение.

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

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

5. "прибить perl-скрипт парсинга, если соединение оборвалось"  +/
Сообщение от NuINu (??) on 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" }


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. "прибить perl-скрипт парсинга, если соединение оборвалось"  +/
Сообщение от greenwar (ok) on 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
}

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "прибить perl-скрипт парсинга, если соединение оборвалось"  +/
Сообщение от cryo (ok) on 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
> }
> а куда тут сам код программы вставлять?

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "прибить perl-скрипт парсинга, если соединение оборвалось"  +/
Сообщение от greenwar (ok) on 15-Дек-10, 22:40 
спасибо, работает
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

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

в crontab

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру