他のプログラムのセットを実行し、ログ記録の目的でそれらの出力を収集することになっているプログラムがあります。標準出力への出力がある限り、すべてが正常に機能しています。
それは私の2つの問題につながります:
STDIN
とSTDERR
別のプログラムの両方を1つのファイルにキャプチャするにはどうすればよいですか?出力がまったくない場合(または出力
STDERR
のみ)、プログラムは次の行でスタックします。while (<$input>)
実行時間が不確定な別のプログラムからの出力の可能性をプログラムに待機させ、プログラムの実行が終了するまでに出力がない場合でも続行するにはどうすればよいですか。
これがコードのそのセクションです
my $pid = open (my $input, '-|', "$prog $args")
or push @errors, "A failute has occurred in $prog $args";
if(not @errors){
while (<$input>){ #POSSIBLE LOCATION FOR HANG UP IF NO PRINTING IS DONE
if($input =~ /^END\n$/){
last;
}
print $fh $_;
}
}
else{
print $fh "An error has occurred with executing \"$prog $args\"";
}
注:$fh
は、ログファイルへの書き込みに使用されるファイルハンドラーであり@errors
、プログラムのエラーを内部的に報告するために使用されます。
編集:Proc :: ReliableSTDOUT
ルートを試してみたときに経験した問題の1つは、とに後遺症があるように見えることSTDERR
です。実行するには、呼び出しごとに修正する必要があります。これは私のコードに別の問題を引き起こします。私は並行して実行しており、すべてのスレッドに変更を加えSTDOUT
て影響を与えます(少なくともWindowsを使用)。STDERR
IO :: CaptureOutputにも同じ問題がありますが、内部でSTDOUT
とジャンブリングを修正しようとし、次のエラーが発生します。STDERR
Couldn't remove temp file 'C:\Users\SBLAKE~1\AppData\Local\Temp\m8E3pUGfOS' - Permission denied at C:/Perl/site/lib/IO/CaptureOutput.pm line 82