首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AnyEvent fork_call和ping

AnyEvent fork_call和ping
EN

Stack Overflow用户
提问于 2013-07-22 20:49:18
回答 2查看 749关注 0票数 3

我正在尝试创建一个perl模块来ping (使用linux系统ping)数百台主机,并获取ping的数据(如数据包丢失、传输了多少数据包和接收了多少数据包等)。从每个主机的stdout。我使用了AnyEvent::Util fork_call,但是我被卡住了,因为它不能收集标准输出。我已经创建了一个小脚本来演示我想要做的事情:

代码语言:javascript
复制
#!/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;

我哪里错了?

EN

回答 2

Stack Overflow用户

发布于 2013-07-22 23:51:02

您需要等待ping完成($cv->recv;),然后才能打印它们的输出。

代码语言:javascript
复制
my $ping_data = fork_ping();
$cv->recv;
p $ping_data;

(您也可以将$cv->recv;放在fork_ping中。)

票数 3
EN

Stack Overflow用户

发布于 2013-07-28 17:25:54

如果用Perl也能解决这个问题,就不要调用外部程序。这将使您的应用程序依赖于ping命令的可用性,它的API (CLI参数名称、顺序、格式)及其可能更改的输出格式。

多年以来,我成功地使用POE::Component::Client::Ping来监控我们数以千计的网络设备。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17788036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档