長い間実行されるBashコマンドパイプラインがある場合、I / Oバッファリングによって生命の兆候がまったく見えないことがよくあります。バッファリングを無効にすることが可能であることをオンラインで見つけましたstdbuf
。表示例ここ例:
tail -f access.log | stdbuf -oL cut -d aq aq -f1 | uniq
ただし、パイプラインでどのコマンドにコマンドプレフィックスを付けるべきかはわかりませんstdbuf
。だから、すべてのコマンドに追加します。バッファリングなしで次のことができます。
cd ~/tmp
stdbuf -i0 -o0 -e0 find /i \! -type d | \
stdbuf -i0 -o0 -e0 sed -u -n -e \
's=.*\<\(\([A-Z_a-z0-9.-]\+\)/\2/\).*=& \1=p' \
2>&1 | stdbuf -i0 -o0 -e0 tee find.out
これにより、私のコードは認知的な面で非常に騒々しくなります。
プレフィックスが必要なコマンドを決定する方法はstdbuf
?
答え1
「ライブ」出力を見ることができない問題はstdoutの出力バッファリングです。入力バッファリングは問題ではなく、標準エラーはデフォルトでバッファリングされません。したがって、削除-i0
と-e0
オプションを設定できます。入力バッファリングをディセーブルにすると、プログラムが遅くなる可能性があるため、実際には非生産的になる可能性があります。
もしそうなら、問題は執筆を扱うことです。とは別に端末では、パイプの最後のコマンドは通常出力をバッファリングしません。 (出力をファイルにリダイレクトし、他のプログラムを介してファイルを表示する場合は除外されます。)
その後、GNU grepにあるように、プログラムにバッファリングを無効にする専用オプションがある場合、それ以上のオプションをgrep --line-buffered
使用する理由はありません。また、GNU sedでバッファリングを無効にすることを意味します。また、リアルタイムで見ることが重要なので、出力をバッファリングしません。stdbuf
sed -u
tail -f
だから私はこれが次のようにしなければならないと思います:
stdbuf -o0 find /i \! -type d | \
sed -u -n -e 's=.*\<\(\([A-Z_a-z0-9.-]\+\)/\2/\).*=& \1=p' 2>&1 | \
tee find.out
(それでもfind
深刻な問題を起こすほどバッファリングが遅いのではないかという気がします。)