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 つのことを実行します。x264へのffmpegパイピング動画です。その出力は乱雑で、4 つの出力の間の 1 つの行を飛び回っています。これらをバックグラウンドで完全に実行し、その出力をリダイレクトして、4 つの個別の出力をきれいに印刷および更新できるようにする方法はありますか? それぞれの工程がどこまで進んでいるかがわかるといいですね。

それが perl で絶対にできない場合は、これをより簡単にする別の言語に私を誘導するために与えられた助けを喜んで受け入れます. ちなみに、これはLinuxの下にあります。ありがとうございました。

Open2は私をはるかに超えています。これをどのように使用しますか?新しい行を作成せずに、それぞれの進行状況をどのように印刷できるかわかりません。各プロセスが行っていることの STDERR と STDOUT を出力し、終了したら、それを更新しない行として保持します。良い説明ではありませんが、私が欲しいものを説明する方法が他にありません。基本的に、最初の 4 つのジョブでは、4 つの行が常に更新されます。次に、これらのジョブの 1 つが完了したら、新しいジョブの新しい行を追加し、何らかの方法で完了したジョブが完了したことを示します。

「open」で簡単なテストを試みましたが、それでもシェルに出力されます。これは Windows の場合ですが、同じように動作するはずです。これは Perl やシェルでも可能でしょうか?

こんにちは?これについてはまだ助けが必要です...

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 に答える