web-dev-qa-db-ja.com

トップコマンド出力のフィルタリング

Macを実行していて、特定のプロセスのtopコマンドの出力をフィルター処理して、PID、COMMAND、および%CPU列のみが表示されるようにします。

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

top -pid 1234

ただし、これにより、そのプロセスの15を超える列が表示されます。コマンドの出力をawkにパイプして、以下のみを表示できますか?

PID COMMAND %CPU

列?

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

12
smokinguns
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 
8
Daniel Beck

これは確かにできるので、私はそれをどのように行うかを説明します。私はこれが最適なアプローチであるふりをしていませんが、それは仕事をします。 Linux(およびbash Shell)を使用しているため、トップのデフォルトの動作が少し異なる場合があります。したがって、特定のシナリオに合わせてこのミニハウツーを調整する必要がある場合があります。

  1. 引数なしでtopを実行するだけです:

    _$ 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を開始します。これは、topから他のプログラムまたはファイルに出力を送信する場合に役立ちます。このモードでは、topは入力を受け入れず、「-n」コマンドラインオプションで設定した反復制限まで、または強制終了されるまで実行されます。

    -n:反復回数の制限は次のとおりです。-nnumber終了する前にtopが生成する反復またはフレームの最大数を指定します。

    これは、出力を1回だけ出力してから終了する、調整されたトップコマンドです。

    _$ 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. これまで、コマンドラインでこれらの操作を行ってきましたが、ハードコードされた特定のケースに永続性と柔軟性を追加する瞬間です。行全体を単純なシェルスクリプトに移動しています。私はそれをtopと呼びます、後で使用されるので名前は強調されています:

    _#!/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%"_

    コマンドのチェーン(パイプを介して接続されている)の出力全体を変数にリダイレクトしました。次に、CPU負荷が最後のフィールドであるため、echoを使用して印刷し、最後に「%」を追加します。

  9. この時点で、引数としてPIDを受け入れ、統計を1回出力するバッチスクリプトがあります。代わりにリアルタイム監視が必要ですか? watchできるので、簡単です。次のようなスクリプトを実行します。

    _$ watch -n 1 3top 2569_

    3topを1秒に1回実行することにより、リアルタイムの監視を行います。

6
vtest

top表示形式はカスタマイズ可能ですが、コマンドラインで表示オプションを指定する方法はありません。ただし、独創性がある場合は、~/.toprcファイルを巧みに操作することで必要なことを実行できます。

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

  1. topを起動します。
  2. 押す f フィールド選択モードに入ります。
  3. 不要な*が横にあるフィールドごとに、対応する文字を押してそのフィールドの選択を解除します。たとえば、 eUser Nameフィールドの選択を解除します。完了したら、*Process Id、およびCPU usageの横にCommand name/lineのみを配置する必要があります。
  4. 押す Space メインウィンドウに戻ります。
  5. 押す W (つまり Shift+w)現在のレイアウトを~/.toprcファイルに保存します。
  6. topを終了し、再起動して設定が保存されていることを確認します。
  7. デフォルトのレイアウトに戻したい場合は、topを起動する前に、~/.toprcの名前を~/min.toprcのような名前に変更してください。最小レイアウトに切り替える場合は、topを起動する前に、~/min.toprcの名前を~/.toprcに戻します。

このファイルの名前を変更して起動するtopは、私よりも1オンス多くの経験と知識を持つ人が、おそらく単純なシェルスクリプトに組み込むことができます。通常のtopレイアウトがすでにカスタマイズされている場合は、特別な考慮が必要になります。

2
William Jackson