top
リダイレクトでコマンドを使用するとうまく機能します。
top > top.log
grepを使って特定の行をフィルタリングしたいと思います。
top | grep "my_program" > top.log
ただし、ログファイルは空のままです。ただし、grepを使用すると出力が提供されます。
top | grep "my_program"
my_program
一部の出力を表示するには、実行中のプログラムに置き換える必要があります。
私の方法がうまくいかないのはなぜですか?どうすれば解決できますか?
答え1
私はあなたが説明するのと同じ動作をします。 Ubuntu 11.10から
top | grep "my_program" > top.log
出力を生成しません。
その理由は、grepが出力をバッファリングするためだと思います。 GNU grepに出力を1行ずつ印刷するように指示するには、次の--line-buffered
オプションを使用します。
top | grep --line-buffered "my_program" > top.log
これも見てくださいだから質問は他の潜在的な解決策。
答え2
以下を使用する必要があります。
top -n 1 | grep "blah" > top.log
「-n 1」は、1回の反復で最上位に実行され、数秒ごとに継続的に更新されるのではなく終了します。
行だけを探しているので、psを使用する方が良いツールです。
答え3
私がこの問題を解決した方法は次のとおりです。
while :;do top -b -n 1 | grep "my_program" >> top.log;done &
これにより、バックグラウンドでmy_programの実行モニターを提供し、すべての結果をtop.logファイルに保存できます。
答え4
どちらも私には役に立ちましたが、Lev Levitskyのアドバイスは正しいと思います。引数を使用してください-b
。
出力リダイレクトが問題である可能性が高く、stdoutを介して何も取得できないため、次のことを試してください。
top -b 2>&1 | grep "my_program" > top.log
出力バッファリングの問題も発生する可能性があります。シェルはこのファイルに継続的に記録しないため、入力にtop.log
時間がかかることがあります。