2番目のパイプが1番目のパイプが完了するのを待たないように設定

2番目のパイプが1番目のパイプが完了するのを待たないように設定

呼び出される長期実行プログラムがあり、my-programstdoutでログを見てファイルにも保存したいと思います。また、各行の前に日付時刻を追加したいと思います。

これが私がやろうとしていることです。

my-program | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }' | tee out.log

問題は、2番目のパイプが最初のパイプの出力が完了するのを待っていることです。

なぜ待って?最初のパイプの出力を1行ずつ処理するにはどうすればよいですか?

ありがとう

答え1

パイプがあると、アプリケーションは出力をより効率的にバッファリングできます。 2番目(および3番目)のプロセスは最初のプロセスと並列に実行されますが、最初のプロセスはバッファを埋めるのに十分な出力を生成できません。

を使用してこの問題を解決できますが、stdbuf出力を完全にバッファリングするのではなくラインバッファリングを強制するため、すべてのパイプの普遍的な万能歯磨き粉としてはお勧めできません。

stdbuf -oL my-program | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }' | tee out.log

stdbuf -oLtooの前に1つを追加することもできますawk。まず使用せずに試して、必要に応じて追加してください。

関連情報