perl:执行多个系统进程并等待它们完成

Bla*_*icz 3 bash perl logging fork

目前在我的Perl脚本中,我进行如下调用:

system(" ./long_program1 & ./long_program2 & ./long_program3 & wait ");
Run Code Online (Sandbox Code Playgroud)

我希望能够记录每个长时间运行的命令执行时仍然执行它们异步.我知道系统调用导致perl生成一个fork,所以这样的事情可能吗?这可以被多个perl fork()和exec()调用替换吗?

请帮我找到更好的解决方案.

DVK*_*DVK 6

当然是.您可以为每个要执行的程序分叉子进程.

你可以做system()exec()分叉后,这取决于你想要多少处理您的Perl代码在系统调用完成后做(因为EXEC()在功能上非常相似system(); exit $rc;)

foreach my $i (1, 2, 3) {
    my $pid = fork();
    if ($pid==0) { # child
        exec("./long_program$i");
        die "Exec $i failed: $!\n";
    } elsif (!defined $pid) {
        warn "Fork $i failed: $!\n";
    }
}

1 while wait() >= 0;
Run Code Online (Sandbox Code Playgroud)

请注意,如果您需要做很多分叉,最好Parallel::ForkManager通过手动分叉来控制它们.