2013-08-30 5 views
12

次のコマンドをテストしましたが、動作しません。なぜ「トップ| grep> file 'not work?

$> top -b -d 1 | grep java > top.log 

標準誤差は使用していません。標準出力を使用していることを確認しましたが、top.logは常に空です。どうしてこれなの?

+0

私は完全にはわかりませんが、topは「インタラクティブ」だと思いますが、標準的な標準出力ストリームはありません。 grepはおそらく入力を得ていません。 – squiguy

+0

Javaは実際に実行されており、表示するには十分なリソースがありますか? – user2357112

+0

[man page](http://www.unixtop.org/man.shtml)によると、あなたが 'top'に渡すオプションは冗長に見えます。 – user2357112

答えて

23

デフォルトでは、grepの出力はバッファを出力します。これは、grepの出力が(システムによって異なる場合がある)出力を超えるまで、top.logに何も書き込まれないことを意味します。

grepに出力時にラインバッファリングを使用するように指示します。試してください:

top -b -d 1 | grep --line-buffered java > top.log 
+0

素晴らしい!それはうまくいく。 ありがとうございます。 – JaycePark

+0

'top'が終了したときに' grep'してその出力をフラッシュするべきではありませんか? '-d 1'を使うとすぐに起こるはずです。 – user2357112

+0

@ user2357112終了する場合のみ! – devnull

2

私の組み込みマシンでは、grepは-line-bufferedオプションを持っていませんでした。だから、私は自分のために、この回避策を使用:

while :;do top -b -n 1 | grep java >> top.log;done & 

このちなみに私は「Javaの」のようなプログラムのためにバックグラウンドで実行中のモニターを持っていると、ファイルtop.logですべての結果を保つことができます。