stdbuf コマンド
標準ストリームのバッファリング操作を変更します。
概要
stdbuf
は、標準入力、出力、エラーストリームのバッファリング操作を変更してコマンドを実行します。プログラムが stdout や stderr に書き込む際のデータのバッファリング方法を制御できるため、プログラム間で出力をパイプで連結する場合や、通常はバッファリングされる出力からリアルタイムの出力が必要な場合に特に役立ちます。
オプション
-i, --input=MODE
入力ストリームのバッファリングを調整します。
$ stdbuf -i0 command
-o, --output=MODE
出力ストリームのバッファリングを調整します。
$ stdbuf -o0 tail -f log.txt | grep "error"
-e, --error=MODE
エラーストリームのバッファリングを調整します。
$ stdbuf -e0 command 2> errors.log
MODE の値
- L: 行バッファリング(各改行後に出力が送信される)
- 0: バッファリングなし(出力が即座に送信される)
- SIZE: 指定されたバッファサイズで完全バッファリング(例:4K、8K)
使用例
リアルタイムログのためのバッファリングなし出力
$ stdbuf -oL grep "error" large_log.txt | tee error_log.txt
[一致が見つかるたびに行ごとに出力が表示される]
複数のバッファ変更の組み合わせ
$ stdbuf -o0 -e0 long_running_process | another_process
[出力とエラーストリームがバッファリングなしで即座に表示される]
リアルタイムでのログファイルの監視
$ stdbuf -oL tail -f logfile.txt | grep --line-buffered "ERROR"
[ERROR] Connection failed at 14:32:15
[ERROR] Database timeout at 14:35:22
ヒント:
バッファリングなし出力を使用するタイミング
別のコマンドにパイプで渡す場合や、リアルタイムでログを監視する場合など、プログラムからの即時出力が必要な場合は -o0
を使用します。これにより、出力がバッファに保持されるのではなく、生成されるとすぐに表示されることが保証されます。
ログ処理のための行バッファリング
ログを1行ずつ処理するコマンドには -oL
を使用します。これにより、処理後の各完全な行が即座に出力されるため、行の整合性を維持しながらリアルタイム監視に役立ちます。
パフォーマンスに関する考慮事項
バッファリングなしの操作は、大量の出力を生成するコマンドのパフォーマンスを低下させる可能性があることに注意してください。リアルタイム出力が必要な場合にのみ、バッファリングなしモードを使用してください。
よくある質問
Q1. 異なるバッファリングモード間の違いは何ですか?
A. バッファリングなし(0)は出力を即座に送信し、行バッファリング(L)は各改行後に出力を送信し、完全バッファリングはバッファが指定されたサイズまで満たされたときに出力を送信します。
Q2. なぜstdbufはすべてのコマンドで動作しないのですか?
A. stdbuf
はLD_PRELOADメカニズムを使用して標準I/O関数を置き換えることで動作しますが、これは静的にリンクされたプログラムや標準I/O関数を使用しないプログラムでは機能しません。
Q3. コマンドが出力をバッファリングしているかどうかを判断するにはどうすればよいですか?
A. 出力が連続的ではなくまとまって表示される場合、バッファリングされている可能性が高いです。stdbuf -o0
でコマンドを実行して、動作が変わるかどうかを確認してみてください。
Q4. ほとんどのコマンドのデフォルトのバッファリング動作は何ですか?
A. デフォルトでは、ほとんどのコマンドは出力が端末に向かう場合は行バッファリングを使用し、出力がファイルやパイプにリダイレクトされる場合は完全バッファリングを使用します。
参考文献
https://www.gnu.org/software/coreutils/manual/html_node/stdbuf-invocation.html
改訂履歴
- 2025/05/06 初版