Як отримати загальне використання процесора (наприклад, 57%) в Linux [закрито]


197

Мені цікаво, як можна отримати використання системного процесора і представити його у відсотках, використовуючи, наприклад, bash.

Вибірка зразка:

57%

У випадку, якщо ядро ​​є більше, було б добре, якби середній відсоток можна було обчислити.


1
@julesanchez значення потрібно записати десь в іншому місці, отже, воно повинно бути int
user1199739

робити вгорі> myfile.txt І застосувати свій фільтр для післяобробки, не правда?
JuSchz

11
Команда, яка не потребує sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

7
Повторне відкриття Я не розумію, чому це визнано поза темою, чи можуть ті, хто його закрив, хотіли б детальніше розглянути?
Джонатан Н

3
Моє розуміння /proc/statдуже обмежена, але це один вкладиш працює досить добре для мене 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)}'. За допомогою sleep 1. Ви можете помістити його в bash while цикл, щоб перевірити його в режимі реального часу.
Yeti

Відповіді:


174

Подивись на cat /proc/stat

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

EDIT, будь ласка, прочитайте коментарі, перш ніж скопіювати це або скористатися для будь-якої серйозної роботи. Це не було перевірено і не використано, це ідея для людей, які не хочуть встановлювати утиліту або щось, що працює в будь-якому дистрибутиві. Деякі люди думають, що ви можете "вдало встановити" будь-що.

ПРИМІТКА: це не поточне використання процесора, а загальне використання процесора у всіх ядрах після завантаження системи. Це може сильно відрізнятися від поточного використання процесора. Для отримання поточного значення зверху (або подібний інструмент) слід використовувати.

Поточне використання ЦП може бути обчислено за допомогою:

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

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
Я думаю, що це рішення не показує поточне завантаження процесора, а середнє завантаження процесора з часу запуску процесора.
Етьєн

11
@jlliagre, так, це правильно. Щоб обчислити СУЧАСНЕ використання CPU не в середньому, вам потрібно буде взяти значення $ 1, потім відкласти, а потім взяти значення $ 1 і побачити різницю. Це поточне використання процесора.
vimdude

102

Ви можете спробувати:

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

11
Кожен раз, коли я виконую цю команду, я отримую точно такий же вихід ( 32.7%).
alanaktion

13
Більш точний результат дає коли я використовую top -bn2, але це займає тривалий час. З того, що я прочитав, здається, це єдиний спосіб отримати точний результат.
alanaktion

7
top -bn1здається дико неточним у моїй системі FC20. top -bn2здається, працює добре.
Мартін Турной

24
Здається, що команда у цій відповіді написана для систем, де top -vповертається procps-ng(наприклад, Fedora). Існує також procps, наприклад, Ubuntu та CentOS, де команда не працює (завжди вказує на 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

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
Я не вірю, що це показує загальний процесор
користувач1199739

Я б сказав, що на 100% простою - це загальне споживання процесора (у%)
Пітер Свенссон

Ось відсоток "не" використаний. Ця відповідь була хорошою, аж до гріп | хвіст | awk part ...
jordanm

Я б змінив awkчастину на:, awk -F " " '{print (100 - $12)"%"}'що дає вихідний формат, як він хотів, але в іншому випадку це мені добре виглядає.
Дан Фего

1
@jordanm Всі істини; Я більше голосував за це, бо це працює. Я б це зробив особисто:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Дан Фего

22

Можливо, я б також підказав фактичну відповідь на моє рішення, яке надихнуло Пітера Лільєнберга:

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

Це буде використовувати awkдля виведення 100 мінус 12-го поля (простою) із знаком відсотка після нього. awkзробить це лише для рядка, де у 12-му полі є лише цифри та крапки ( $12 ~ /[0-9]+/).

Ви також можете оцінити п'ять зразків, одна секунда:

$ 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 за замовчуванням показує статистику з початку, і це не сильно змінюється з часом,
Саранг,

1
"mpstat | awk '$ 12 ~ / evidence0-9.Sense+/ {print 100 - $ 11"% "}'" ця робота для мене.
AloneInTheDark

@Sarang Дякую тобі !! Нарешті я можу отримати результати, які conkyтакож відображаються. На жаль, ця лінія ДУЖЕ повільна, майже забирає до однієї цілої секунди.
синтаксичний помилка

6
@syntaxerror Це займає рівно 2 секунди, тому що якщо ви подивитесь на команду, ви допоможете побачити, що перший аргумент - це інтервал, але він виконується лише один раз через другий аргумент, тому він чекає 2 повних секунди, поки не поверне результат.
Йохан Б'єрехолт

Питання закрите, тому додав мою (подібну) відповідь до вашої :-) Сподіваюся, ви не заперечуєте. Як і ви, мене надихнула відповідь Пітера Лільєнберга.
PJ Brunet

16

ВЕДЕНО: Я помітив, що у відповіді іншого користувача% idle було поле 12 замість поля 11. AWK було оновлено для врахування змінної поля% idle.

Це має отримати бажаний вихід:

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, щоб переконатися, що використання процесора відібрано протягом секунди
Христос

1
Якщо у вас є JQ:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
Nyet
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.