綾小路龍之介の素人思考

[linux] パイプ|は出力をバッファリングしない

パイプで繋げた出力をモニタリングしていたらバッファリングされていることが良くある。これの問題はそれぞれのプログラムの出力がバッファリングされているからで、パイプはバッファリングを行わない。そんなわけで、それぞれのプログラムがオプションでバッファフラッシュのタイミングを制御できるようになっていれば問題ない。そうでない場合はどうしようもない。

例えば、以下のような場合、perlとsedで出力バッファリングされているので、いつまでたっても出力されない。正しく言えば、perlの出力バッファがフルになってからsedに渡され、sedのバッファがフルになった後に出力される。

$ perl -le 'while(1) {print ++$i; sleep 1;}' | sed -e "s%\(.*\)%: \1%"
^C

そこで、以下のように出力バッファをフラッシュするタイミングを制御する。perlではこうすることで行単位で出力バッファがフラッシュされ、sedの場合は-uオプションで適当にバッファがフラッシュされる。(おそらく行単位でフラッシュ)

$ perl -le '$|=1; while(1) {print ++$i; sleep 1;}' | sed -u -e "s%\(.*\)%: \1%"
: 1
: 2
: 3
: 4
: 5
^C

リファレンス

  1. stdoutをバッファに溜めない方法 - Google 検索
  2. [linux-users:107525] stdoutをバッファに溜めない方法
  3. linux-users 案内ページ
  4. [linux-users:107530] Re: stdoutをバッファに溜めない方法
  5. linux stdout バッファ - Google 検索
  6. linux リダイレクト バッファ - Google 検索
  7. Perlで出力のバッファリングを無効にするには - Sakura scope
  8. perl バッファリング - Google 検索
  9. sed, a stream editor: 呼び出し
  10. sed バッファリング - Google 検索

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2009-11-18T02:42:15+09:00
  2. Modified: 2009-11-18T02:42:15+09:00
  3. Generated: 2017-07-26T23:09:18+09:00