|
|
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)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/449839feedf9.html, оценка из 5, голосов 10
|