2016-07-27 6 views
0

どういうわけか、実行中の./program | tee /dev/nullがその出力を消費しているようです。独自に実行すると、プログラムは何らかのテキストを出力し、UDPソケットを介して通信しながら実行を続けます。私はフィルタリングされた方法で見たいと思っていた多くのログメッセージを生成するので、私は./program | grep -v "I dont wan't to see logs like this!" | tail -fを実行しようとしましたが、出力は生成されませんでした。私はちょっとあきらめて、ちょうどteeというファイルを別のファイルに出力することにしました。これをエディタで調べることはできましたが、空のファイルが作成されました。tee/dev/null入力を消費していますか?

問題のプログラムは生徒によって書かれているため、問題がその中にある可能性があります。何がこの現象を引き起こす可能性がありますか?どうすれば修正できますか?

概要:

./programプリントoutputが、./program | tee /dev/null何も印刷されません。おそらく./programのソース内に問題がありますが、それを正しく使用する方法はありますか?

+0

おそらく、プログラムはstdoutがリダイレクトされているかどうかを検出しますか?あるいは、stdoutハンドルのファイル記述子を変更しようとしますか?あなたはプログラムのソースを持っていますか? –

答えて

1

これは一般に、問題のプログラムがターミナルに接続されているかどうかをチェックし、ターミナルと非ターミナルの違いが異なる場合に発生します。この問題を回避し、出力はとにかくスクリプトを使用することでキャプチャする最も簡単な方法:

script -c "./program" /dev/stdout | grep -v "I dont wan't to see logs like this!" | tail -f 

scriptは、疑似端末(それはそれは、端末に接続されていると思われます)でプログラムを実行し、そして書きます/dev/stdoutに出力し、grepにパイプします。

scriptの引数は、書き込みごとに出力をフラッシュするようにすることもできます(そうしないと、パイプに書き込む前にバッファリングされます)。

+0

ありがとう、私はそれを試み、それは動作しませんでしたが、それは本当の問題を把握するのに役立ちました。なんらかの理由でソースにコードが含まれています: 'if(!fork()){...}' else ...なので、私が思っているフォークで実行しているのは問題の原因です。とにかく、無意味なフォークを外してそれを固定しました。 – LambdaBeta

+0

Nevermind、私はそれを修正したと思っていましたが、プログラムをC'edしたら出力をダンプするだけでした。あなたの 'script'ソリューションでも同様の結果が出ました。これは正しく出力されていますが、実際には更新されません。ライブアップデートは、プログラムがパイプなしで呼び出された場合にのみ発生します。私はfflush(stdout)を追加して助けても役に立たなかった...役に立たなかった。 – LambdaBeta

+0

プログラムが終了したときではなく、ライブで更新したい場合は、上記のスクリプトを書くのに '-f'オプションを使う必要があります... –

関連する問題