Linuxで全体的なCPU使用率(57%など)を取得する方法[終了]


194

たとえば、システムのCPU使用率を取得し、bashを使用してパーセントで表示する方法を知りたいと思います。

出力例:

57%

コアが複数ある場合は、平均パーセンテージを計算できると便利です。


1
@julesanchez値は別の場所にパイプする必要があるため、intである必要があります
user1199739

top> myfile.txtを実行して、後処理でフィルターを適用しても大丈夫ですか?
JuSchz

11
sysstatを必要としないコマンド:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

7
再開なぜこれが主題外であると判断されたのか分かりませんが、それを閉じた人は詳しく説明してもらえますか?
Jonathan H

3
私の理解/proc/statは非常に限られていますが、この1行で十分ですcat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'。%.2fを使用すると、出力する小数点以下の桁数を制御sleep 1でき、平均化する時間を設定できます。つまり、平均化したい時間を設定できます。これをbashのwhileループに入れて、リアルタイムでテストできます。
イエティ2016

回答:


174

を見てみましょう cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

編集は、これをコピーして貼り付けたり、深刻な作業に使用する前にコメントを読んでください。これはテストも使用もされていません。ユーティリティをインストールしたくない人や、あらゆるディストリビューションで機能するもののためのアイデアです。何でも「apt-get install」できると考える人もいます。

注:これは現在の CPU使用率ではなく、システムの起動以降のすべてのコアの全体的なCPU使用率です。これは、現在のCPU使用率とは大きく異なる可能性があります。現在の値を取得するには、top(または同様のツール)を使用する必要があります。

現在のCPU使用率は、次のようにして計算できます。

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
ただし、上記で推奨するようにmpstatをインストールする必要があります。多くの人々はそのような柔軟性を持っていません。cat / proc / statの場合、パイプは、推奨するmpstatよりもはるかに簡単です。
vimdude 2013年

12
+1別のユーティリティの解析が解析よりも優れている理由がわかりません/proc/stat
モニカーを回復してください

9
システム+ユーザー+アイドル= 100%。したがって、おそらく次のようになります:grep 'cpu' / proc / stat | awk '{cpu_usage =($ 2 + $ 4)* 100 /($ 2 + $ 4 + $ 5)} END {print cpu_usage "%"}'
vimdude

106
このソリューションは、現在のCPU負荷ではなく、CPUが起動してからの平均CPU負荷を示していると思います。
エティエンヌ

11
@jlliagre、そうです。平均ではなく現在のCPU使用量を計算するには、$ 1の値を取得してから遅延させ、$ 1の値を取得して違いを確認する必要があります。これが現在のCPU使用量です。
vimdude 2015

102

あなたが試すことができます:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
このコマンドを実行するたびに、まったく同じ出力(32.7%)が得られます。
アラナクション2013

13
を使用するとより正確な結果が得られますtop -bn2が、時間がかかります。私が読んだことから、これは正確な結果を得る唯一の方法のようです。
アラナクション2013

6
top -bn1私のFC20システムでは、非常に不正確に思えます。top -bn2うまくいくようです。
Martin Tournoij、2014

23
この回答のコマンドは、top -vリターンがあるシステムprocps-ng(Fedoraなど)向けに書かれているようです。またprocps、UbuntuやCentOSなどでコマンドが機能しない場合もあります(CPUの数値が異なるフォーマットの行のために解析が失敗するため、常に100%を示します)。ここではバージョンだその両方の実装で動作します:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
補足:OSXでは、以下を使用しますtop -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'
mklement0 2014

38

パッケージmpstatからお試しくださいsysstat

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

その後、一部cutまたはgrepあなたが必要とする情報を解析します:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
私はこの番組に合計CPU信じていない
user1199739

合計CPU使用率(%)である100%アイドル
ピータースベンソン

これは、「使用されていない」割合です。この回答は、grepまでは良かった| 尾| awkパート...
ジョーダン

awk部分を次のawk -F " " '{print (100 - $12)"%"}'ように変更します。これにより、出力は彼の希望どおりにフォーマットされますが、それ以外の場合はこれで問題ありません。
Dan Fego

1
@jordanmすべての真実。それが機能するので、私はもっと投票していました。私は個人的にこれを行います:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

Peter Liljenbergのアイデアに触発された私の解決策で実際の応答をスローすることもできます。

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

これはawk、100から12番目のフィールド(アイドル)を引いた後、パーセント記号を付けて出力するために使用します。awkこれは、12番目のフィールドに数字とドットのみ($12 ~ /[0-9]+/)がある行に対してのみこれを行います。

1秒間隔で5つのサンプルを平均化することもできます。

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

次のようにテストします。

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
「mpstat 2 1 | ...」を実行して、最後の1秒間の統計を表示することをお勧めします。それ以外の場合、デフォルトでは、mpstatは最初から統計を表示し、時間が経過してもそれほど変化しません
Sarang

1
"mpstat | awk '$ 12〜/[0-9.]+/ {print 100-$ 11"% "}'"この作業は私に適しています。
AloneInTheDark 14

@Sarangありがとうございます!! 最後に、conky表示されている結果も取得できます。残念ながら、この行は非常に遅く、実行に1秒ほどかかります。
構文エラー

6
@syntaxerrorコマンドヘルプを見ると、最初の引数は間隔であることがわかりますが、2番目の引数が原因で1回しか実行されないため、結果が返されるまで2秒間待機するため、正確に2秒かかります。
JohanBjäreholt、2015年

質問は締め切られたので、私の(同様の)回答をあなたの質問に追加しました:-)よろしくお願いします。あなたのように、私はピーター・リリエンバーグの答えに触発されました。
PJ Brunet

16

編集:私は別のユーザーの返信で%idleがフィールド11ではなくフィールド12であることに気付きました。変数である%idleフィールドを考慮してawkが更新されました。

これにより、必要な出力が得られます。

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

単純な整数の丸めが必要な場合は、printfを使用できます。

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'ありがとうございます。mpstat 1 1に注意して、CPU使用量が1秒間にサンプリングされることを確認してください
chrishiestand

1
あなたはJQを持っている場合:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
NYET
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.