Итак, у меня возникла проблема с массивом @cpuAll, потерявшим значение после $ pm-> finish. Это просто SSHing на кучу серверов и возвращает некоторые статистические данные, которые отлично работают. Но после завершения последнего цикла массив не будет печататься. Я не хочу писать все в файлы, потому что получаю 90% увеличение производительности, просто загружая его в массив.Perl forkmanager dropping value value
my @cpuAll =();
my @memAll =();
$pm->run_on_finish(sub{
my ($pid,$exit_code,$ident,$exit_signal,$core_dump,$data)[email protected]_;
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;
Вы добавляете данные в '@ cpuAll' в дочернем процессе, но пытаетесь извлечь его из' @ cpuAll' в родительском процессе. Вам необходимо отправить данные от ребенка родительскому. См. Раздел в документах P :: FM под названием «ВОЗВРАТ ДАТЫСТРУКТУРЫ из дочерних процессов». – ikegami
Но я думал, что с тех пор, как я объявил его за пределами цикла, он будет придерживаться, ваше высказывание, поскольку это совершенно другой процесс, который ему нужно вернуть, чтобы использовать его в родительском процессе. – ThatGuy
Да, изменение переменной в одном процессе не влияет на аналогичные именованные переменные в других процессах. Слава Богу! – ikegami