Eval / alarm работает? - PullRequest
       1

Eval / alarm работает?

1 голос
/ 30 сентября 2011

Я пишу быстрый скрипт для проверки сбоев и интерпретации трафика балансировщика нагрузки. Я хочу, чтобы он продолжал пытаться устанавливать соединения после того, как он не может соединиться с тем или иным хостом. Мой текущий скрипт не выглядит так, как будто он выполняет блок eval в подпрограмме mkcnct, и я не могу понять, почему. Кто-нибудь может заметить, что я делаю не так?

#!/usr/bin/perl

use strict;
use Net::HTTP;
use Getopt::Std;

my %opts;

getopts('ht:',\%opts);

my @hostlist ("www.foo.com","www1.foo.com","www2.foo.com");

my $timeout;

if ($opts{t} =~ /\d+/) {
 $timeout = $opts{t} + time();
} else {
 $timeout = 3600 + time();
}

while ($timeout < time()) {
 foreach my $host (@hostlist) {
  my $cnct = mkcnct($host);
  if ($cnct) { mkreq($cnct) };
 }
}

sub mkreq {
 my $cnct = shift;
 my $time = gettime();
 my $out;
 $cnct->write_request(GET => "/index.html");
 ($out->{code},$out->{message},%{$out->{headers}}) = $cnct->read_response_headers;
 printf "%s\t%s - Size %d\tLast modified %s\n", $time, $out->{message}, $out->{headers}{'Content-Length'}, $out->{headers}{'Last-Modified'};
 $out = "";
 $cnct->write_request(GET => "/pki/ca.crl");
 ($out->{code},$out->{message},%{$out->{headers}}) = $cnct->read_response_headers;
 printf "%s\t%s - Size %d\tLast modified %s\n", $time, $out->{message}, $out->{headers}{'Content-Length'}, $out->{headers}{'Last-Modified'};
}

sub mkcnct {
 my $host = shift;
 my $time = gettime();
 my $cnct;
 eval{
  local $SIG{ALRM} = sub { print "$time\tCannot connect to $host\n"};
  alarm(2);
  $cnct = Net::HTTP->new(Host => $host);
  alarm(0);
 };
 alarm(0);
 return($cnct);
}

sub gettime {
 my @time = localtime(time);
 my $out;
 $out = sprintf "%d\/%d\/%d %d:%d", ($time[4] + 1), $time[3], ($time[5] % 100 ), $time[2], $time[1];
 return($out);
}

1 Ответ

0 голосов
/ 30 сентября 2011

Попробуйте заменить return ($ cnct);с возвратом $ cnct;в мкнкт.Возможно, вы захотите пересмотреть документы по возвращению скаляров и списков

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...