vin*_*k89 1 parallel-processing perl append
我有一个代码,它按预期工作。但是我很难将每个执行命令的输出存储在$result = $ssh->capture($command_to_execute);. 这使用Parallel::ForkManager模块通过使用不同的文件作为输入参数在不同的主机中运行命令。
命令执行完成后,我希望结果输出应存储在$result变量中。它应该将每个主机结果附加到相同的变量中,最后我想处理$result. 我正在使用.=将结果数据附加到$result但它似乎没有工作。
在这里粘贴我的代码以供参考:
.
.
.
my $result;
my $pm = Parallel::ForkManager->new(5);
DATA_LOOP:
foreach my $n (1..$num_buckets) {
my $pid = $pm->start and next DATA_LOOP;
$command_to_execute = $my_command." ".$Files{$n};
my $ssh = SSH_Connection( $list_of_ips[$n-1], 'username', 'pass' );
$result = $ssh->capture($command_to_execute);
$result .= "Result from File:$Files{$n} and Host:$list_of_ips[$n-1] is $result\n";
print "Result: INSIDE: $result";
$pm->finish;
}
$pm->wait_all_children;
print "Result: OUTSIDE: $result";
print "Done\n";
sub SSH_Connection {
my ( $host, $user, $passwd ) = @_;
my $ssh = Net::OpenSSH->new($host,
user => $user,
password => $passwd,
master_opts => [-o => "StrictHostKeyChecking=no"]
);
$ssh->error and die "Couldn't establish SSH connection: ". $ssh->error;
return $ssh;
}
Run Code Online (Sandbox Code Playgroud)
print "Result: INSIDE: $result";可以一一打印结果。但是print "Result: OUTSIDE: $result";
是空的,它实际上应该具有$results从for循环内部获取的组合结果。
如Parallel::ForkManager的文档中所示,要从 child 获取结果,您需要提供对结果的引用作为 的另一个参数finish。
$pm->finish(0, [$Files{$n}, $list_of_ips[$n-1], $result]);
Run Code Online (Sandbox Code Playgroud)
使用run_on_finish收集的结果:
my $result;
$pm->run_on_finish( sub {
my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $single_result) = @_;
$result .= "Result from File: $single_result->[0] and Host: $single_result->[1]"
. " is $single_result->[2]\n";
Run Code Online (Sandbox Code Playgroud)