所以我遇到了数组@cpuAll在$ pm->完成后失去它的价值的问题。这只是SSH连接到一堆服务器并带回一些工作正常的统计数据。但是在最后一个循环完成后,数组将不会打印。我不想把所有内容都写到文件中,因为只需将其加载到数组中就可以获得90%的性能提升。
my @cpuAll = ();
my @memAll = ();
$pm->run_on_finish(sub{
my ($pid,$exit_code,$ident,$exit_signal,$core_dump,$data)=@_;
push(@data,$data);
});
for(@servers)
{
next if $_ =~ "10.1.4.52";
next if $_ =~ "10.1.4.106";
my $pid = $pm->start and next;
chomp;
my @output_cpu = `/usr/bin/ssh $_ \"/root/scripts/punkbuster.cpu|sed 's/ (//g'|sed 's/)//g'|sed s'/ //g'\"`;
for(@output_cpu)
{
chomp;
my ($server,$username,$cpu,$process)=(split /:/, $_)[0,1,2,3];
# push(@cpuAll,"$server\,$username\,$cpu\,$process\,$date\,$time\n");
}
$pm->finish(0, [$server,$username,$cpu,$process]);
}
print $_ for @data;
print "OK\n";
$pm->wait_all_children;
答案 0 :(得分:2)
我过去遇到过类似的问题,我相信你会在data structure retrieval的文档中找到解决方案。您需要传递数据以完成$pm->finish(0, \@cpuAll)
,然后在$pm->run_on_finish
中使用回调来循环遍历数组并打印您需要的任何内容。我提供的链接显示了一个代码示例,该示例应该非常清楚如何检索数据。如果没有,请告诉我,我会在答案中添加更多内容。
答案 1 :(得分:1)
my $pssh = Net::OpenSSH::Parallel->new;
for my $server (@servers) {
$pssh->add_host($server);
}
$pssh->push(*, cmd => { stdout_file => "%LABEL%.out" },
"/root/scripts/punkbuster.cpu|sed 's/ (//g'|sed 's/)//g'|sed s'/ //g'");
$pssh->run;
my @cpuAll;
for my $server (@servers) {
if (open my $fh, '<', "$server.out") {
my ($server,$username,$cpu,$process) = split /:/;
push @cpuAll, join ',', (split /:/)[0..3], $date, $time;
}
else {
warn "unable to retrieve data for $server\n";
}
}
print "$_\n" for @cpuAll;
我还会用perl中的一些本地后处理替换sed
替换。