web-dev-qa-db-ja.com

簡単な結果として、1行のコマンドでLinuxプロセスのリアルタイムCPU使用率を取得します

私はどこでも検索しましたが、これについては何も見つかりませんでした。 PIDで指定された1つのプロセスのCPU使用率を示す小さなゲージを作成しようとしています。

簡単な答えを出力するコマンドが必要なので、top -p $ pidが適切でないのはなぜですか。コマンドはPHPによって実行され、応答をすぐに出力する必要があります。

私が必要としているものと密接に関連しているものは

Sudo ps -p $pid -o %cpu

しかし、さらにテストして検索したところ、プロセスが開始されてからの平均使用量が印刷されていることがわかりました。上に表示されているように、コマンドsiが実行された瞬間からリアルタイムで使用する必要があります。

これは可能ですか?

編集::

$cmd = 'Sudo sh -c "top -n1 | awk \'/30100/ {print $9}\'"';
echo exec($cmd);

シェルなしで試しました

$cmd = "Sudo top -n1 | awk '/30100/ {print $9}'";
echo exec($cmd);

それでも結果はありません、それは何もエコーしません

2
Aron H.

さて、私はそのような素朴なアプローチから始めます:

$ top |grep %pid

Ubuntu 12.04では、topの更新ごとに1回PIDの行を出力します。

    username@usrver / $ top |grep 2593
 2593 username   20   0 1103m 170m  16m S   30  2.2  67:25.38 chrome             
 2593 username   20   0 1103m 170m  16m S   28  2.2  67:26.24 chrome             
 2593 username   20   0 1103m 170m  16m S   30  2.2  67:27.15 chrome             
 2593 username   20   0 1103m 170m  16m S   23  2.2  67:27.86 chrome             
 2593 username   20   0 1103m 170m  16m S   25  2.2  67:28.60 chrome

次に、awkで10番目のフィールドを取得しますが、ここではgrepを使用する必要はありません。 awkはPIDを正規表現してから、CPU値を出力できます。

username@usrver / $ top | awk '/2593/ {print $10}'
25
29
30
32
1
ernesto ricks

質問はすでに回答され、受け入れられていますが、不完全だと思います。受け入れられた答えから欠落しているいくつかのポイントがあります。

  1. 子プロセスとして実行していて、意味のある出力を取得したい場合は、-bを使用してバッチモードでtopを実行する必要があります。そうでない場合は、インタラクティブモードで実行した結果、制御文字が混在します。

  2. -nを使用して、必要な反復回数を指定します。そうしないと、反復が無限になり、子プロセスが終了しません。 topが実際のCPU使用率である差を収集するための参照ポイントを持つように、少なくとも2回の反復が必要です。

  3. -dを使用して反復間の間隔を指定します。ほとんどのシステムでは、デフォルト値は3秒です。したがって、1秒あたりの使用量が必要な場合は、明示的に指定する必要があります。

上記のすべてのポイントを組み合わせると、

top -b -n 2 -d 1

2回の反復があるため、2番目の出力のみを考慮する必要があります。 awkを使用して、文字列topで始まる2番目の出力を取得します。

top -b -n 2 -d 1 | awk '/^top/{i++}i==2'

次に、PID、たとえば2593をフィルターで除外し、CPU使用率を含む9番目の列を出力します。 PIDで始まる出力行のみを考慮してください。

top -b -n 2 -d 1 | awk '/^top/{i++}i==2' | awk '/^\s*2593/ {print $9}'
2
Vishal