3
my $pm = new Parallel::ForkManager(4);

foreach my $array (@lines) {
        $pm->start and next;
        $cmd = 'command';
        print "\n$cmd\n\n";
        exec($cmd);
        $pm->finish; }
$pm->wait_all_children;

如您所见,我的代码一次运行 4 件事。这是 ffmpeg 管道视频到 x264。它的输出很杂乱,在 4 个输出之间的单线上跳来跳去。有没有办法在后台完全运行这些并重定向其输出,以便我可以干净地打印和更新 4 个单独的输出?这会很好,所以我可以告诉每个过程有多远。

如果它绝对不能在 perl 中完成,我很乐意接受任何帮助来指导我使用另一种语言,这会使这更容易。顺便说一下,这是在 Linux 下。谢谢你。

Open2远远超出了我。我将如何使用它?我无法理解如何在不换行的情况下打印每件事的进度。我想打印每个进程正在执行的任何内容的 STDERR 和 STDOUT,当它结束时,将其保留为不更新的行。这不是一个很好的解释,但我不知道如何解释我想要的。基本上,前 4 个作业会有 4 行不断刷新。然后,当其中一项工作完成时,为新工作添加一个新行,并可能以某种方式指示已完成的工作已完成。

我尝试使用“open”进行快速测试,它仍然输出到 shell。这是在 Windows 中,但它的行为仍应相同。这甚至可以用 Perl 甚至在 shell 中实现吗?

你好?我仍然需要这方面的帮助...

4

1 回答 1

2

如果要捕获每个进程的 STDOUT,可以使用open而不是exec运行子进程。

foreach my $array(@lines) { 
    $pm->start and next;
    my $cmd = 'command';
    open my $cmd_out, '-|', $cmd or die "Can't start process: $!";

    # read from command output
    while( my $line = <$cmd_out> ) { 
        # do something with output
    }

    $pm->finish;
}

如果您需要同时捕获 STDOUT 和 STDERR,请参阅IPC::Open2。如果您还需要 STDIN 的句柄,还有IPC::Open3 。

于 2012-07-20T02:00:20.980 回答