Arrays Perl forkmanager正在删除数组值
所以我遇到了一个问题,数组@cpuAll在$pm->finish之后失去了价值。。这只是对一堆服务器进行SSHing,并带回一些工作正常的统计数据。但在最后一个循环完成后,数组将不会打印。我不想将所有内容都写入文件,因为只要将其加载到阵列中,性能就可以提高90%Arrays Perl forkmanager正在删除数组值,arrays,multithreading,perl,Arrays,Multithreading,Perl,所以我遇到了一个问题,数组@cpuAll在$pm->finish之后失去了价值。。这只是对一堆服务器进行SSHing,并带回一些工作正常的统计数据。但在最后一个循环完成后,数组将不会打印。我不想将所有内容都写入文件,因为只要将其加载到阵列中,性能就可以提高90% my @cpuAll = (); my @memAll = (); $pm->run_on_finish(sub{ my ($pid,$exit_code,$ident,$exit_signal,$core_dum
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;
我过去也遇到过类似的问题,我相信您会在上的文档中找到解决方案。您需要像
$pm->finish(0,\@cpuAll)
一样传递数据以完成,然后使用$pm->run\u on\u finish
中的回调来循环数组并打印您需要的任何内容。我提供的链接显示了一个代码示例,它应该非常清楚如何检索数据。如果没有,请告诉我,我将在我的答案中添加更多内容。我过去遇到过类似问题,我相信您会在上的文档中找到解决方案。您需要像$pm->finish(0,\@cpuAll)
一样传递数据以完成,然后使用$pm->run\u on\u finish
中的回调来循环数组并打印您需要的任何内容。我提供的链接显示了一个代码示例,它应该非常清楚如何检索数据。如果没有,请告诉我,我会在回答中添加更多内容。使用
my$pssh=Net::OpenSSH::Parallel->new;
对于我的$server(@servers){
$pssh->添加主机($server);
}
$pssh->push(*,cmd=>{stdout\u文件=>%LABEL%.out},
“/root/scripts/punkbuster.cpu | sed's/(//g'| sed's/)//g'| sed's'///g'”;
$pssh->run;
我的@cpuAll;
对于我的$server(@servers){
如果(打开我的$fh,使用
my$pssh=Net::OpenSSH::Parallel->new;
对于我的$server(@servers){
$pssh->添加主机($server);
}
$pssh->push(*,cmd=>{stdout\u文件=>%LABEL%.out},
“/root/scripts/punkbuster.cpu | sed's/(//g'| sed's/)//g'| sed's'///g'”;
$pssh->run;
我的@cpuAll;
对于我的$server(@servers){
如果(打开我的$fh,'嘿,所以我做了一些类似的事情,但是我的run_on_finish没有正确地通过args。如果它仍然对你不起作用,我建议编辑你的帖子,以便我们可以看到代码。然后我们可以提出一些明智的建议。我真的不知道从哪里开始我很难理解文档所说的内容ng我应该这样做。我不需要打印它,但最终会将生成的每个数组中的所有数据添加到单个数组中。好的,我尝试了编辑,如果你能看到我的错误,请告诉我。嘿,我做了类似的事情,但我的run_on_finish没有正确地传递参数。如果它仍然对你不起作用,我建议编辑你的张贴以便我们可以查看代码。然后我们可以提出一些明智的建议。我真的不知道从哪里开始我很难理解文档中说我应该做什么。我不需要打印它,但最终会将生成的每个数组中的所有数据添加到单个数组中。好的,我尝试了编辑,如果你能看到我在哪里,请告诉我向上唱。您将数据添加到子进程中的@cpuAll
,但尝试从父进程中的@cpuAll
检索数据。您需要将数据从子进程发送到父进程。请参阅P::FM文档中标题为“从子进程检索数据结构”的部分.但我认为,既然我在循环之外声明了它,它就会坚持,因为它是一个完全不同的进程,需要传递回父进程才能使用。是的,在一个进程上更改一个变量不会神奇地影响其他进程中类似命名的变量。感谢上帝!您将数据添加到循环中的@cpuAll
子进程,但尝试从父进程中的@cpuAll
检索它。您需要将数据从子进程发送到父进程。请参阅P::FM文档中标题为“从子进程检索数据结构”的部分.但我认为既然我在循环之外声明了它,它就会坚持,你的说法是,因为它是一个完全不同的进程,需要传递回父进程中使用。是的,在一个进程上更改变量不会神奇地影响其他进程中类似命名的变量。感谢上帝!
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;