gpt4 book ai didi

perl - AnyEvent fork_call 和 ping

转载 作者:行者123 更新时间:2023-12-04 02:50:52 25 4
gpt4 key购买 nike

我正在尝试创建一个 ping 的 perl 模块(使用 linux 系统 ping)
到数百台主机,并从每台主机的标准输出中获取 ping 的数据(如丢包和传输的数据包数量以及接收的数据包数量等)。
我使用了 AnyEvent::Util fork_call,但我被卡住了,因为它没有收集标准输出。
我创建了一个小脚本来演示我正在尝试做的事情:

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

我哪里错了?

最佳答案

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

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

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

关于perl - AnyEvent fork_call 和 ping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17788036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com