2013-07-22 25 views
3

我試圖創建一個perl模塊,ping(使用linux系統ping) 到數百個主機,並獲得ping的數據(如丟包,多少數據包傳輸和多少收到等)從每個主機的標準輸出。 我用AnyEvent :: Util fork_call,但因爲它不收集標準輸出而卡住了。 我創建了一個小腳本,演示了我想要做的事:AnyEvent fork_call和ping

#!/usr/bin/perl 
use strict; 
use warnings; 

use AnyEvent; 
use AnyEvent::Util 'fork_call'; 
use DDP; 

my $cv = AE::cv; 

my @hosts = ('google.com', 'xkcd.com', 'pastebin.com', 'youtube.com'); 

sub fork_ping { 
    my $interval  = 0.2; 
    my $source_address = '1.1.1.1'; 
    my $number_of_pings = 5; 
    my $timeout   = 5; 

    my %ret_val; 

    foreach my $host (@hosts) { 
     $cv->begin; 
     fork_call { 
      my $stdout = `ping -c $number_of_pings -I $source_address -i $interval -W $timeout $host 2>&1`; 
      return $stdout; 
     } sub { 
      $ret_val{$host} = shift; 
      $cv->end; 
     }; 
    } 

    return \%ret_val; 
} 


my $timer = AE::timer 0, 5, sub { 

    my $ping_data = fork_ping(); 
    p $ping_data; 
}; 

$cv->recv; 

我在哪裏有錯?

回答

3

您需要等待ping才能完成($cv->recv;),然後才能打印輸出。

my $ping_data = fork_ping(); 
$cv->recv; 
p $ping_data; 

(你也可以放置$cv->recv;fork_ping內。)

1

不要調用外部程序,如果你可以用Perl解決它。它將使您的應用程序依賴於ping命令的可用性,它的API(CLI參數名稱,順序,格式)及其可能更改的輸出格式。

我使用POE :: Component :: Client :: Ping成功數年來監測我們的數千個網絡設備。