37

特定の「top」コマンドの出力をファイルに書き込みたい。グーグルを実行したところ、次のコマンドを使用して実行できることがわかりました。

top -n 10 -b > top-output.txt

ここで、-nは反復回数を指定し、-bはバッチモードを指定します。これは、10回の反復でトップにすると非常にうまく機能します。しかし、Ctrl-Cを使用してコマンドの実行を中断すると、出力ファイルが空のように見えます。

事前に反復回数がわからないので、手動で壊す必要があります。反復を指定せずにtopの出力をファイルにキャプチャするにはどうすればよいですか?

私が正確に使おうとしているコマンドは

top -b | grep init > top-output.txt

そして私が望むときはいつでもそれを壊します。しかし、それは機能しません。

編集:質問にさらにコンテキストを与えるために、入力ファイルを使用してツールを呼び出すJavaコードがあります。ツールの場合と同様に、ファイルを入力として受け取り、しばらくの間実行してから、次のファイルを受け取ります。ツールにフィードする必要がある100,000個のファイルのセットがあります。だから今私はその特定のツールを監視しようとしています(それはLinuxでプロセスとして実行されます)。不要なデータでは大きすぎるため、「top」のデータ全体をファイルとしてキャプチャすることはできません。そのプロセスのシステム統計をキャプチャし、topを使用してファイルに書き込む方法は?

4

10 に答える 10

40

私にとっては、たとえ私がそれを壊したとしても、oktop -b > test.txtからのすべての出力を保存します。最初にダンプしてから、結果のファイルをダンプすることをお勧めします。topctrl-cgrep

于 2012-07-30T21:22:02.317 に答える
13

whileループと-n 1:を使用するのはどうですか

while sleep 3; do 
  top -b -n1 | grep init > top-output.txt
done
于 2012-07-30T21:35:44.527 に答える
5

すべての反復が終了するまで、出力はファイルに書き込まれていないようです。これは、次のような外部ループでラップすることで解決できます。

touch top-output.txt
while true; do
    top -b | grep init >> top-output.txt
done
于 2012-07-30T21:26:19.513 に答える
2

これが私のマックで使用したい1ライナーです:

top -o -pid -l 1 | grep "some regexp"

乾杯。

于 2015-05-12T19:20:45.817 に答える
1

この問題を解決しました。これは、Ctrl + cを押しても機能します。CPU%を記録したいときに同じ問題に直面していました。次のシェルスクリプトを実行します。

#!/bin/sh
while true; do
    echo "$(top -b -n 1 | grep init)"  | tee -a top-output.log
    sleep 1
done
  • topコマンドから抽出したいものは何でもgrepできます。このスクリプトを使用して、ファイルに保存します。
  • -b:バッチモード操作 topをバッチモードで開始します。これは、topから他のプログラムまたはファイルに出力を送信する場合に役立ちます。このモードでは、topは入力を受け入れず、-nコマンドラインオプションで設定した反復制限まで、または強制終了されるまで実行されます。
  • -n number、このオプションは、topが終了する前に生成する反復またはフレームの最大数を指定します。ここでは-n1を使用ました。
  • 詳細man topについては
  • tee -aを使用すると、出力をコンソールに表示し、出力をファイルに保存することもできます。-オプションは、出力をファイルに追加します。
  • ここでは、1秒の間隔を設定しました。他の間隔について言及することができます。

-bおよび-nの説明のソース:マンページ

man top

クルティカ

于 2017-09-13T06:02:41.303 に答える
1

CTRL + Cは、制御がCLIにとどまるため、理想的なソリューションではありません。最上位の出力をファイルにダンプする以下のコマンドを使用できます。

top -n 1 -b > top-output.txt
于 2018-04-11T16:29:05.770 に答える
1

コメントで@Thorが指摘しているように、それgrepが任意にバッファリングされているのではなく、オプションを使用して行ごとにバッファリングされていることを確認する必要があります。--line-buffered

top -bn 10 | grep 'init' --line-buffered | tee top-output.txt

grepを実行しなくても、出力をtopファイルにリダイレクトすることは問題なく機能し、割り込みが含まれます。

于 2018-04-16T13:31:12.170 に答える
0

私はまったく同じ問題を抱えていました...

ここに私の行がありました:

top -b -u myUser | grep -v Prog.sh | grep Prog > myFile.txt

myFile.txtが作成されますが、Ctrl+Cを実行すると空になります。したがって、トップコマンドを開始した後、2番目のトッププロセスを開始しました。最初のトップのPIDを見つけ(試行錯誤を繰り返し)、2番目のトップを介してそれを強制終了すると、最初のトップが期待どおりにファイルに書き込まれました。

お役に立てば幸いです。

于 2012-12-17T21:42:10.387 に答える
0

topコマンドをバックグラウンドで実行したい場合(ログアウト/スリープなどを気にしないでください)-nohupまたはバッチジョブまたはcronまたはscreenを利用できます。

nohupの使用(略:No Hang Up):

次の内容のtop-exec.shというファイルにtopコマンドを保存するとします。

 top -p <PID> -b > /tmp/top.log

関心のあるプロセスのtopコマンドを置き換えることができます。次に、次のようにnohupを使用してtop-exec.shを実行できます。

$> nohup top-exec.sh &

これにより、topコマンドのすべての出力が「top.log」という名前のファイルにリダイレクトされます。

于 2016-02-26T18:40:15.457 に答える
-1

一番上のコマンドから、すべてのプロセスとそのPID(プロセスID)を確認できます。1つのプロセスのみのトップ出力を印刷するには、次のコマンドを使用します。

$ top –p PID

プロセスの最上位コマンドをファイルに保存するには、次のコマンドを使用します。

top -p $PROCESS_ID -b  > top.log

ここで、>は標準出力をファイルにリダイレクトします。

于 2016-02-16T03:11:58.900 に答える