dwm
を使用するためにbashスクリプトを作成していますxsetroot
。すべてが期待どおりに動作します。私が見逃しているのは、*nix
標準ツールのみを使用してシステムの各コア(コアが4つあります)の現在の負荷を提供する簡単な方法です。たとえば、を使用してこれを行う方法がわかりませんtop
。これまで、このサイトで見つけた他のすべての投稿は負荷平均のみをカバーしています。前にこのようなことをした人はいますか?
私がすべてのコアに適用したい主な理由は、プログラムが私が並列に書いたいくつかのコード(たとえば、すべてのループ)を実行していることを確認できる安価で粗雑なツールを持つことです。
答え1
これにより、要素がCPUごとにロードされるbash配列が作成されます。
loads=($(mpstat -P ALL 1 1 | awk '/Average:/ && $2 ~ /[0-9]/ {print $3}'))
Bash配列は0から始まり番号が付けられるため、2番目のCPUの負荷は次のように印刷されます。
echo ${loads[1]}
これにはユーティリティが必要ですmpstat
。 Debianシリーズシステムにインストールするには、次の手順を実行します。
apt-get install sysstat
どのように動作しますか?
その結果、やや冗長な出力は次mpstat
のようになります。
$ mpstat -P ALL 1 1
Linux 3.2.0-4-amd64 (MyMachine) 08/30/2014 _x86_64_ (2 CPU)
10:12:35 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
10:12:36 PM all 1.49 0.00 1.49 0.00 0.00 0.00 0.00 0.00 97.01
10:12:36 PM 0 0.00 0.00 2.02 0.00 0.00 0.00 0.00 0.00 97.98
10:12:36 PM 1 1.96 0.00 1.96 0.00 0.00 0.00 0.00 0.00 96.08
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
Average: all 1.49 0.00 1.49 0.00 0.00 0.00 0.00 0.00 97.01
Average: 0 0.00 0.00 2.02 0.00 0.00 0.00 0.00 0.00 97.98
Average: 1 1.96 0.00 1.96 0.00 0.00 0.00 0.00 0.00 96.08
これはすべてのCPUを表示するように-P ALL
指示し、パラメータは毎秒出力を印刷し、最初の秒後に停止するように指示します。mpstat
1 1
必要な値のみを選択するには、awk
次のコマンドを使用します。
awk '/Average:/ && $2 ~ /[0-9]/ {print $3}'
これにより、最後の数行のみが選択されます(およびで始まる行、Average:
2番目の列に数字がある行のみが選択されます)。これらの行に対して、3番目の列(CPUロード)が印刷されます。
括弧を使用すると、mpstat
パイプawk
の出力が bash 配列としてキャプチャされます。
答え2
コアあたりの平均使用量の計算/proc/stat
これまで私が思いついた最高の解決策は、bc
浮動小数点演算を計算することです。
# Calculate average cpu usage per core.
# user nice system idle iowait irq softirq steal guest guest_nice
# cpu0 30404 2382 6277 554768 6061 0 19 0 0 0
A=($(sed -n '2,5p' /proc/stat))
# user + nice + system + idle
B0=$((${A[1]} + ${A[2]} + ${A[3]} + ${A[4]}))
B1=$((${A[12]} + ${A[13]} + ${A[14]} + ${A[15]}))
B2=$((${A[23]} + ${A[24]} + ${A[25]} + ${A[26]}))
B3=$((${A[34]} + ${A[35]} + ${A[36]} + ${A[37]}))
sleep 2
# user + nice + system + idle
C=($(sed -n '2,5p' /proc/stat))
D0=$((${C[1]} + ${C[2]} + ${C[3]} + ${C[4]}))
D1=$((${C[12]} + ${C[13]} + ${C[14]} + ${C[15]}))
D2=$((${C[23]} + ${C[24]} + ${C[25]} + ${C[26]}))
D3=$((${C[34]} + ${C[35]} + ${C[36]} + ${C[37]}))
# cpu usage per core
E0=$(echo "scale=1; (100 * ($B0 - $D0 - ${A[4]} + ${C[4]}) / ($B0 - $D0))" | bc)
E1=$(echo "scale=1; (100 * ($B1 - $D1 - ${A[15]} + ${C[15]}) / ($B1 - $D1))" | bc)
E2=$(echo "scale=1; (100 * ($B2 - $D2 - ${A[26]} + ${C[26]}) / ($B2 - $D2))" | bc)
E3=$(echo "scale=1; (100 * ($B3 - $D3 - ${A[37]} + ${C[37]}) / ($B3 - $D3))" | bc)
echo $E0
echo $E1
echo $E2
echo $E3
コアあたりの平均CPU使用量は直接計算できます/proc/stat
(使用のヒントを提供した@mikeservに感謝します/proc/stat
)。
# Here we make use of bash direct array assignment
A0=($(sed '2q;d' /proc/stat))
A1=($(sed '3q;d' /proc/stat))
A2=($(sed '4q;d' /proc/stat))
A3=($(sed '5q;d' /proc/stat))
# user + nice + system + idle
B0=$((${A0[1]} + ${A0[2]} + ${A0[3]} + ${A0[4]}))
B1=$((${A1[1]} + ${A1[2]} + ${A1[3]} + ${A1[4]}))
B2=$((${A2[1]} + ${A2[2]} + ${A2[3]} + ${A2[4]}))
B3=$((${A3[1]} + ${A3[2]} + ${A3[3]} + ${A3[4]}))
sleep 0.2
C0=($(sed '2q;d' /proc/stat))
C1=($(sed '3q;d' /proc/stat))
C2=($(sed '4q;d' /proc/stat))
C3=($(sed '5q;d' /proc/stat))
# user + nice + system + idle
D0=$((${C0[1]} + ${C0[2]} + ${C0[3]} + ${C0[4]}))
D1=$((${C1[1]} + ${C1[2]} + ${C1[3]} + ${C1[4]}))
D2=$((${C2[1]} + ${C2[2]} + ${C2[3]} + ${C2[4]}))
D3=$((${C3[1]} + ${C3[2]} + ${C3[3]} + ${C3[4]}))
# cpu usage per core
E0=$(((100 * (B0 - D0 - ${A0[4]} + ${C0[4]})) / (B0 - D0)))
E1=$(((100 * (B1 - D1 - ${A1[4]} + ${C1[4]})) / (B1 - D1)))
E2=$(((100 * (B2 - D2 - ${A2[4]} + ${C2[4]})) / (B2 - D2)))
E3=$(((100 * (B3 - D3 - ${A3[4]} + ${C3[4]})) / (B3 - D3)))
echo $E0
echo $E1
echo $E2
echo $E3
あるいは、bash直接配列割り当てを広く使用して短縮します。
# Here we make use of bash direct array assignment by assigning line
# 2 to 4 to one array
A=($(sed -n '2,5p' /proc/stat))
# user + nice + system + idle
B0=$((${A[1]} + ${A[2]} + ${A[3]} + ${A[4]}))
B1=$((${A[12]} + ${A[13]} + ${A[14]} + ${A[15]}))
B2=$((${A[23]} + ${A[24]} + ${A[25]} + ${A[26]}))
B3=$((${A[34]} + ${A[35]} + ${A[36]} + ${A[37]}))
sleep 0.2
# user + nice + system + idle
C=($(sed -n '2,5p' /proc/stat))
D0=$((${C[1]} + ${C[2]} + ${C[3]} + ${C[4]}))
D1=$((${C[12]} + ${C[13]} + ${C[14]} + ${C[15]}))
D2=$((${C[23]} + ${C[24]} + ${C[25]} + ${C[26]}))
D3=$((${C[34]} + ${C[35]} + ${C[36]} + ${C[37]}))
# cpu usage per core
E0=$((100 * (B0 - D0 - ${A[4]} + ${C[4]}) / (B0 - D0)))
E1=$((100 * (B1 - D1 - ${A[15]} + ${C[15]}) / (B1 - D1)))
E2=$((100 * (B2 - D2 - ${A[26]} + ${C[26]}) / (B2 - D2)))
E3=$((100 * (B3 - D3 - ${A[37]} + ${C[37]}) / (B3 - D3)))
echo $E0
echo $E1
echo $E2
echo $E3
top
ソリューションベース
追加のツールをインストールせずにこれを行うことができますtop
(後でこれを使用しました)。郵便はがき.) デフォルトでは、top
起動時に平均 CPU 負荷のみが表示されますが、 を押すとすべての CPU が表示されます1
。バッチ出力モードでCPU出力を使用するには、起動時にデフォルトの動作にtop
設定する必要があります。top
これはファイルを使用して行うことができます~/.toprc
。幸いなことに、このファイルは自動的に作成できます。top
を押して押す1
と、ホームフォルダにファイルが作成されW
ます。~/.toprc
今実行してみると、すべてのコアが出力されているtop -bn 1 | grep -F '%Cpu'
ことがわかります。top
今、私たちは仕事を完了するために必要なすべてを持っています。必要なすべての情報は、3
の出力になる配列列にありますtop
。
一つの問題があります。特定のコアのCPU使用率がコマンド100%
によってアレイ出力に達すると、現在ロードされている列がある列から3
別の列に移動されます2
。したがって、列の出力がawk '{print $3}'
表示されます。よろしければ、ただ残してください。そうでない場合は、印刷バーを使用することもできます。それではそうします。これらのトラップをすべて回避する解決策は次のとおりです。us,
3
awk
2
:
top -bn 2 | grep -F '%Cpu' | tail -n 4 | gawk '{print $2 $3}' | tr -s '\n\:\,[:alpha:]' ' '
すべての改行と文字の出力を削除し、\n
スペースを1つだけ除くすべてを削除します。,
[:alpha:]
-s
答え3
私はこの解決策を思い出し、それは私にとって効果的です。
echo print `top -n 1 | tr -s " " | cut -d$" " -f10 | tail -n +8 | head -n -1 | paste -sd+ | bc`/ `nproc` | python
ソース(作成): https://mohammadg.com/programming/how-to-get-overall-cpu-utilization-from-the-bash-command-line/
答え4
次のコマンドを使用して、各コアの周波数を表示できます。
$ cat /proc/cpuinfo