2012-03-17 15 views
4

はので、私はbashの上でこれを実行しています:特定のデータを、このコマンドは何バッシュ出力ストリーム書込み

# somedevice -getevent 

それだけで実行し続けており、毎回私のデバイスが送信し、それは温度の変化を検出言います

/dev/xyz: 123 4567 8910112238 20 
/dev/xyz: 123 4567 8915712347 19 
/dev/xyz: 123 4567 8916412345 22 
/dev/xyz: 123 4567 8910312342 25 
/dev/xyz: 123 4567 8910112361 18 
/dev/xyz: 123 4567 8910112343 20 

これはちょうど実行中であり、何らかの原因を出すとすぐに何かを出力します。だから実行に終わりはない。

いいえ、エコーは完全に動作しますが、私は '>'演算子を使用しようとしていますが、これはファイルに書き込まれていないようです。

ので、インスタンス

#somedevice -getevent > my_record_file 

のために、これはしかし、私はすぐに書き込まれるようにしたい、my_record_fileのみ間隔でそれに書き込まれたデータを取得し、正常に動作しません。

アイデア?

+0

遅れは出力バッファリングの可能性があります。あなたは、各印刷の後にflush()するか、標準出力で自動フラッシュをセットするようにプログラムを変更できますか? –

+0

さて、私は私の問題のための解決策を考え出しました、それはバッファリングの問題でした 'somedevice -getevent | grep "" --line-buffered> myrecordfile "は問題を解決しました。おそらくそのベストアイデアではありませんが、今はこのハックが仕事をしました。 – mur

答えて

5

stdoutが端末デバイスであるかどうかによって、C標準ライブラリが出力バッファリングモードを変更するため、出力がバッファされています。端末デバイス(isatty(3)による)の場合、stdoutはラインバッファーです。改行文字が書き込まれるたびにフラッシュされます。端末デバイスでない場合は、が完全にバッファされます:特定の量のデータ(通常は4KBから64KB程度のもの)が書き込まれるたびにフラッシュされます。

したがって、シェルの>リダイレクション演算子を使用してコマンドの出力をファイルにリダイレクトすると、出力はターミナルに出力されず、出力もバッファされます。プログラムはsetvbuf(3)と友人とのバッファリングモードを変更できますが、プログラムはこれを行うために協力しなければなりません。多くのプログラムには、それらをラインバッファにするためのコマンドラインオプションがあります。 grep(1)--line-bufferedオプション。あなたのコマンドにも同様のオプションがあるかどうかを確認してください。

このようなオプションがない場合は、unbuffer(1)などのツールを使用して出力ストリームのバッファを解放することができますが、必ずしも機能するとは限りません。標準ユーティリティではないため、常に利用できるとは限りません。

0

あなたは「ティー」を試すことができます。

somedevice -getevent | tee -a my_record_file 

「-a」オプションは、単にコンテンツを置き換えるのではなく追加することです。

+0

私はそれがどんな違いを生むかわかりません... –

2

コマンドsomedeviceはおそらく "標準入力/出力ライブラリ"を使用し、そのライブラリではデフォルトでバッファリングがオンになっています。出力がターミナル/コンソールに出力されるとオフになります。

somedeviceプログラムを変更できますか?もしそうでなければ、あなたはまだそれをハックすることができます。詳細は、http://www.pixelbeat.org/programming/stdio_buffering/を参照してください。

+0

理論は非常に有益でした...私は主な問題を把握するのに役立ちました! thnx! – mur

0

これはおそらく、 "somedevice -getevent"コマンドのstdoutがブロックバッファリングされているためです。 thisによれば、stdoutは端末であれば、デフォルトではラインバッファリング(つまり、あなたが望むもの)され、そうでなければブロックバッファリングされます。

somedeviceコマンドのマニュアルを見て、出力を強制的にバッファリングされていないか、またはラインバッファされているかどうか確認してください。そうでない場合は、stdbuf -oL somedevice -getevent > my_record_fileはあなたが望むことをする必要があります。

+1

このように私はこのエラーが発生しました。「ERROR:ld.so:object '/usr/lib/coreutils/libstdbuf.so' from LD_PRELOADはプリロードできません:無視されました。問題を出して、コメントで私の質問に修正を掲載しました – mur

関連する問題