2013-10-03 50 views
0

所以我遇到一個數組@cpuAll在$ pm-> finish後失去它的值的問題..這只是對一堆服務器進行SSH連接並將一些工作狀態恢復正常。但是在最後一個循環完成後,數組不會打印。我不想將所有文件都寫入文件,因爲我將它加載到數組中後性能提高了90%。Perl forkmanager刪除數組值

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; 
+0

您可以在子進程中將數據添加到'@ cpuAll',但嘗試從父進程中的'@ cpuAll'檢索它。您需要將孩子的數據發送給父母。請參閱P :: FM文檔中標題爲「從子進程中檢索數據結構」的部分。 – ikegami

+0

但是我認爲自從我宣佈它在循環之外它會堅持,因爲它是一個完全不同的過程,它需要傳回以在父進程中使用。 – ThatGuy

+0

是的,更改一個進程上的變量不會奇蹟般地影響其他進程中類似命名的變量。感謝上帝! – ikegami

回答

2

我已經在過去遇到類似的問題,我相信你會發現在data structure retrieval的文檔中的解決方案。您需要傳遞數據才能完成,如$pm->finish(0, \@cpuAll),然後在$pm->run_on_finish中使用回調來遍歷數組並打印您需要的任何內容。我提供的鏈接顯示了一個代碼示例,它應該非常清楚如何檢索數據。如果沒有,請告訴我,我會在我的回答中添加更多內容。

+0

嘿,所以我做了一些類似的事情,但我的run_on_finish沒有正確傳遞參數。 – ThatGuy

+0

如果它仍然不適合你,我會建議編輯你的文章,以便我們可以看到代碼。然後我們可以提出一些明智的建議。 – SES

+0

我真的不知道從哪裏開始我無法理解文檔說什麼我應該這樣做。我不需要打印它,但最終將生成的每個陣列的所有數據添加到單個陣列。 – ThatGuy

1

使用Net::OpenSSH::Parallel

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換人。