Macを実行していて、特定のプロセスのtop
コマンドの出力をフィルター処理して、PID、COMMAND、および%CPU列のみが表示されるようにします。
プロセスのPIDを取得した後、次を実行します。
top -pid 1234
ただし、これにより、そのプロセスの15を超える列が表示されます。コマンドの出力をawkにパイプして、以下のみを表示できますか?
PID COMMAND %CPU
列?
出力をテキストファイルに保存してから処理したくありません。プロセスをリアルタイムで監視することに興味があります。
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
これは確かにできるので、私はそれをどのように行うかを説明します。私はこれが最適なアプローチであるふりをしていませんが、それは仕事をします。 Linux(およびbash Shell)を使用しているため、トップのデフォルトの動作が少し異なる場合があります。したがって、特定のシナリオに合わせてこのミニハウツーを調整する必要がある場合があります。
引数なしで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を消費するプロセスを選択しました。これを、最終目標を達成するためのテストプロセスとして使用します。
デフォルトでは、topはインタラクティブモードで実行されます。これは私には合いません。関連するデータをキャプチャして印刷したいと思います。その後、インタラクティブにデータを表示する作業を担当します。トップマンページからの関連する引用:
-b:バッチモード操作「バッチモード」でtopを開始します。これは、topから他のプログラムまたはファイルに出力を送信する場合に役立ちます。このモードでは、topは入力を受け入れず、「-n」コマンドラインオプションで設定した反復制限まで、または強制終了されるまで実行されます。
-n:反復回数の制限は次のとおりです。-nnumber終了する前にtopが生成する反復またはフレームの最大数を指定します。
これは、出力を1回だけ出力してから終了する、調整されたトップコマンドです。
_$ top -b -n 1
_
監視したいPIDがわかっているので、topにもう1つ制限を追加して、そのプロセスに関するデータのみを出力します。
_$ top -b -n 1 -p 2569
_
バッチモードでも、topは、稼働時間、空きメモリ/スワップなどのその他のシステム全体の統計を含むヘッダーを出力します。これは必要ありません。必要なのは1行だけです-プロセスに関するデータを含む行なので、次のように出力全体からカットします。
_$ top -b -n 1 -p 2569 | tail -n 2 | head -n 1
_
ご覧のとおり、1から2行目です。
この行をawkにパイプして、必要な列のみを抽出します。
_$ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'
_
これまで、コマンドラインでこれらの操作を行ってきましたが、ハードコードされた特定のケースに永続性と柔軟性を追加する瞬間です。行全体を単純なシェルスクリプトに移動しています。私はそれをtopと呼びます、後で使用されるので名前は強調されています:
_#!/bin/bash
_
_top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'
_
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
_
また、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を使用して印刷し、最後に「%」を追加します。
この時点で、引数としてPIDを受け入れ、統計を1回出力するバッチスクリプトがあります。代わりにリアルタイム監視が必要ですか? watchできるので、簡単です。次のようなスクリプトを実行します。
_$ watch -n 1 3top 2569
_
3topを1秒に1回実行することにより、リアルタイムの監視を行います。
top
表示形式はカスタマイズ可能ですが、コマンドラインで表示オプションを指定する方法はありません。ただし、独創性がある場合は、~/.toprc
ファイルを巧みに操作することで必要なことを実行できます。
top
の表示をまだカスタマイズしていない(そして~/.toprc
ファイルがない)と仮定します。
top
を起動します。*
が横にあるフィールドごとに、対応する文字を押してそのフィールドの選択を解除します。たとえば、 eUser Name
フィールドの選択を解除します。完了したら、*
、Process Id
、およびCPU usage
の横にCommand name/line
のみを配置する必要があります。~/.toprc
ファイルに保存します。top
を終了し、再起動して設定が保存されていることを確認します。top
を起動する前に、~/.toprc
の名前を~/min.toprc
のような名前に変更してください。最小レイアウトに切り替える場合は、top
を起動する前に、~/min.toprc
の名前を~/.toprc
に戻します。このファイルの名前を変更して起動するtop
は、私よりも1オンス多くの経験と知識を持つ人が、おそらく単純なシェルスクリプトに組み込むことができます。通常のtop
レイアウトがすでにカスタマイズされている場合は、特別な考慮が必要になります。