topコマンド出力のフィルタリング


11

私はMacを使っていますが top PID、COMMAND、および%CPU列のみが表示されるように、特定のプロセスに対するコマンド

プロセスのPIDを取得したら、実行します。

top -pid 1234

ただし、これはそのプロセスについて15を超える列を表示します。コマンドの出力をawkにパイプインして、次のものだけを表示できますか。

PID COMMAND %CPU

列?

出力をテキストファイルに保存してから処理したくありません。私はリアルタイムでプロセスを監視することに興味があります。

回答:


7
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907:あなたのプロセスID
  • -stats pid,command,cpu:プロセスID、名前、CPU%のみを表示

実行する必要はありません awk 出力に。


出力を後処理したい場合は、 -l 0 駆け込む ロギング モード(0は無期限に意味し、それ以外はサンプル数を制限します)。出力は次のようになります(2回の繰り返し)。

Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09 
CPU usage: 20.0% user, 26.66% sys, 53.33% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 0.0 
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09 
CPU usage: 0.95% user, 1.90% sys, 97.14% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 2.7 

つかいます awk または13行ごとにのみ表示する同様のツール(これらの行にはこの例の値が含まれているため)

$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907  WindowServer 0.0 
3907  WindowServer 1.3 
3907  WindowServer 2.2 

6

これは確かに可能であり、私はそれをどのようにするかを説明するつもりです。私はこれが最適なアプローチであるとは思わないが、それは仕事をする。私はLinux(そしてbashシェル)を使っているので、topのデフォルトの振る舞いは少し違うかもしれません。したがって、あなたはあなたの特定のシナリオのためにこのミニハウツーを調整する必要があるかもしれません。

  1. とにかく走れ 引数なしで、

    $ top

    これが私の出力からのヘッダと関連行です。

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java

    私はしばらくの間メモリにとどまり、実際にCPUを消費するプロセスを選びました。最終的な目標を達成するためのテストプロセスとしてそれを使用します。

  2. デフォルトでは、topは対話モードで動作します。これは私には向いていません。関連するデータをキャプチャして印刷したいのです。その後対話的にデータを表示するタスクを処理します。トップマンページからの引用符:

    -b:バッチモード運用        'バッチモード'でtopを起動します。これは送信に便利です。        上から他のプログラムまたはファイルへの出力。これで        mode、topは入力を受け付けず、反復まで実行されます。        '-n'コマンドラインオプションで設定した制限まで        殺した。

    -n:繰り返し回数の制限:-n number        最大反復数、つまりフレーム数を指定します。        終わる前に作り出すべきです。

    これは調整されたtopコマンドで、一度だけ出力を表示してから終了します。

    $ top -b -n 1

  3. 見たいPIDを知っているので、topにもう1つ制限を加えます。そのため、そのプロセスに関するデータだけを出力します。

    $ top -b -n 1 -p 2569

  4. バッチモードでも、topはまだアップタイム、空きメモリ/スワップなどのシステム全体の統計情報を含むヘッダを表示します。必要なのは1行だけです - 私のプロセスに関するデータが含まれている行です。したがって、このように出力全体から切り取ります。

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1

    ご覧のとおり、1行目から2行目があります。

  5. この行をawkにパイプして、必要な列だけを抽出します。

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  6. これまで、コマンドラインでこれらの操作を行ってきましたが、ハードコードされた特定のケースに永続性と柔軟性を追加するときが来ました。行全体を単純なシェルスクリプトに移動しています。私はそれを呼ぶよ 3トップ 名前は後で使われるので強調されています。

    #!/bin/bash

    top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  7. PID番号はハードコードされています。コマンドライン引数として受け入れるようにスクリプトを作成する方法は次のとおりです。

    #!/bin/bash

    top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

    PID 2569に関する統計情報を3top表示するには、次のように呼び出す必要があります。

    $ ./3top 2569

  8. CPU負荷後のパーセンテージも表示したいので、3topスクリプトを次のように調整します。

    #!/bin/bash

    out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')

    echo "$out%"

    一連のコマンド(パイプで接続されている)の出力全体を変数にリダイレクトしました。それから、echoを使ってそれを表示し、最後に '%'を追加します。CPUの負荷が最後のフィールドなので

  9. この時点で、引数としてPIDを受け取り、統計情報を一度出力するバッチスクリプトがあります。リアルタイム監視をしたいですか?簡単です。 時計 出来る!このようにスクリプトを実行します。

    $ watch -n 1 3top 2569

    毎秒1回3topを実行することでリアルタイムモニタリングを行います。


11
ユーザーはOS X上でGnuを持っていません top 無効なオプションまたは構文:-b 。なぜこれが繰り返し支持されたのかわかりません。
Daniel Beck

5
Gnu top (に procps )Homebrew、MacPorts、またはFinkを使用してインストールすることはできず、どちらかを使用してソースからコンパイルすることもできません。 make または cc top.c
Daniel Beck

2

top 表示形式はカスタマイズ可能ですが、コマンドラインで表示オプションを指定する方法はありません。あなたが独創的であれば、しかし、あなたは巧妙に操作することによってあなたが必要とすることをおそらくすることができます ~/.toprc ファイル。

の表示をまだカスタマイズしていないと仮定します。 top (そして持っていない ~/.toprc ファイル):

  1. 起動する top
  2. 押す f フィールド選択モードに入ります。
  3. それぞれのフィールドについて * それの隣にあなたがしたくない場合は、そのフィールドを選択解除するために対応する文字を押してください。たとえば、 e を選択解除する User Name フィールド。あなたが終わったとき、あなたはただ持っているべきです * の隣に Process IdCPU usage、そして Command name/line
  4. 押す スペース メインウィンドウに戻ります。
  5. 押す W (すなわち シフト + w 現在のレイアウトをあなたに保存する ~/.toprc ファイル。
  6. 終了する topその後、再起動して設定が保存されたことを確認します。
  7. デフォルトのレイアウトに戻したい場合は、名前を変更してください。 ~/.toprc のように ~/min.toprc 起動する前に top。最小レイアウトに切り替えたい場合は、名前を変更してください。 ~/min.toprc 戻る ~/.toprc 起動する前に top

このファイルの名前変更と起動 top おそらく私よりもオンスの経験と知識を持った誰かが単純なシェルスクリプトを作ることができます。あなたの定期的な場合は、特別な配慮が必要になります top レイアウトはすでにカスタマイズされています。


手動でもフィルタを追加することは可能ですか。 .toprc?フィルターを追加したい RUID>999 起動時に
Dr Beco
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.