将结果数据附加到 Parallel::ForkManager Perl 中的标量变量

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"; 是空的,它实际上应该具有$resultsfor循环内部获取的组合结果。

cho*_*oba 5

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)