7

他のプログラムのセットを実行し、ログ記録の目的でそれらの出力を収集することになっているプログラムがあります。標準出力への出力がある限り、すべてが正常に機能しています。

それは私の2つの問題につながります:

  1. STDINSTDERR別のプログラムの両方を1つのファイルにキャプチャするにはどうすればよいですか?

  2. 出力がまったくない場合(または出力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
4

2 に答える 2

1

Proc :: Reliableを見てください、それはあなたが望むもののようです。

参照:

于 2012-08-08T18:07:17.967 に答える
1

POSIXのようなシェルから起動する場合、2>&1表記は標準エラーを標準出力と同じ場所に送信します。

some-program-to-be-logged 2>&1 | perl logger.pl -o /chosen/log.file

標準出力と標準エラーの両方が、Perlロギングスクリプトの標準入力に送信されます。

ロガースクリプトの入力ループは、読み取る入力があるまで、またはパイプが書き込み用に開いているすべてのプロセスがパイプを閉じるまで(通常は終了するため)待機します。

于 2012-08-12T05:21:01.710 に答える