Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Evgeny Kariakin                      2:5020/744.100 31 Oct 2000  19:43:30
 To : All
 Subject : alarm();
 -------------------------------------------------------------------------------- 
 
 
    Есть скрипт, постоянно висящий в памяти (но не демон) и делающий
 хттп-запросы. По ночам имеет обыкновение виснуть, по top'у при этим видно его
 состояние 'sbwait' (кстати, что это). Похоже, при очередном коннекте что-то не
 срабатывает либо система, на которой озапущен скрипт, либо целевой сервер или
 прокси, через которые хожу.
    Так вот, он может в этом состоянии провисеть и больше суток, а потом
 отвиснуть и продолжить работу дальше.
    Из мануала взял пример сабжевой функции, получилось вот что:
 
 --= тут все аплодируют, аплодируют... [cj_Resources.pm] =--
 
 --= [ cut ] ==><8==--
 
 sub http_get {
 
 my ( $host, $port, $banner, $headers, $do_click ) = @_;
 my ( $iaddr, $paddr, $HTTPout );
 my $HTTP_answer_code = 0;
 
    $HTTPout = './banner-' . ( $banner ) ;
    return( -1 ) unless( open( OUT,">>$HTTPout" ) && -w $HTTPout );
    binmode( OUT ); select( OUT ); $| = 1; select( STDOUT );
    eval {
       local $SIG{ALRM} = sub { die "alarm\n" };
       alarm( 90 );
       return( -2 ) unless( defined( $iaddr = inet_aton( $host )));
       return( -3 ) unless( socket( SERVER, PF_INET, SOCK_STREAM, getprotobyname(
 'tcp' )));
       $paddr = sockaddr_in( $port, $iaddr );
       return( -4 ) unless( connect( SERVER, $paddr ));
        select( SERVER ); $| = 1; select( STDOUT );
       print SERVER $headers;
       print OUT "" . (( $do_click ) ? 'click' : 'show') . "
 headers:$EOL$headers";
       print OUT "--[" . (( $do_click ) ? 'click' : 'show') . " begin]--$EOL";
       while( <SERVER> ) {
          last if( /^[\x0a|\x0d]+$/ );
          if( /^HTTP\/\d\.\d\s\d+?\s/ ) {
             $HTTP_answer_code = $_;
             chomp( $HTTP_answer_code );
             $HTTP_answer_code =~ s/^HTTP\/\d\.\d\s(\d+?)\s.*/$1/
          }
          if(( /^Location:\s/ ) && ( $HTTP_answer_code == 302 )) {
             $location = $_;
             $location =~ s/^Location:\s(.*)/$1/;
             while( $location =~ /.*[\x0a\x0d]$/ ) { chop( $location ) }
          }
          print OUT;
       }
       alarm( 0 );
    };
    return( -5 ) if( $@ && $@ ne "alarm\n" );
    print OUT "--[" . (( $do_click ) ? 'click' : 'show') . " end]--$EOL$EOL";
    while( <SERVER> ) { }
    close( SERVER ) unless( $do_click );
    close( OUT );
    return( $HTTP_answer_code )
 }
 
 --= [ cut ] ==><8==--
 
 --= кончили аплодировать [cj_Resources.pm] =---------------
 
    Hо скрипт при таймауте умирает, вместо того, чтобы работать дальше.
 Подскажите, что не так?
 
                                          Hу вpоде всё, пока.
                                          Евгений Карякин <waf*mail.ru>
 
 ... Иди сюда, я научу тебя греху.
 --- Hападавший 'GoldED+/W32' унёс 1.1.4.3 кг золота.
  * Origin: Automatic life (2:5020/744.100)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 alarm();   Evgeny Kariakin   31 Oct 2000 19:43:30 
Архивное /ru.perl/449839feedf9.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional