3

何百ものホストに (Linux システムの ping を使用して) ping を実行し、標準出力から ping のデータ (パケット損失、送信されたパケットの量、受信されたパケットの量など) を取得する perl モジュールを作成しようとしています。各ホストの。AnyEvent::Util fork_call を使用しましたが、stdout が収集されないため行き詰まりました。私がやろうとしていることを示す小さなスクリプトを作成しました:

#!/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;

どこが間違っていますか?

4

2 に答える 2

3

$cv->recv;出力を印刷するには、ping が完了するのを待つ必要があります ( )。

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

( の$cv->recv;内側に配置することもできfork_pingます。)

于 2013-07-22T15:51:02.193 に答える
1

Perl でも解決できる場合は、外部プログラムを呼び出さないでください。これにより、アプリは ping コマンドの可用性、API (CLI パラメーター名、順序、形式) およびその出力形式に依存するようになり、変更される可能性があります。

私は何年も前から POE::Component::Client::Ping を使用して何千ものネットワーク デバイスを監視しています。

于 2013-07-28T09:25:54.140 に答える