Отримання використання процесора в режимі реального часу


11

Коли я виконую наступну команду для використання CPU, я отримую приємне + користувальницьке використання CPU.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Вихід:

14.5

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

Я хочу отримати використання процесора у режимі реального часу на виході. Будь ласка, допоможіть мені покращити моє командування.


моніторинг в режимі реального часу askubuntu.com/questions/293426/…
Qasim

Цей простий баш сценарій робить саме це: askubuntu.com/a/450136/243213
Крейг ван Тондер

Відповіді:


20

Якщо ви можете дозволити собі затримку на одну секунду, це надрукує використання процесора як простий відсоток:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Без затримки на одну секунду, vmstatможна друкувати лише середні значення після завантаження.)


Не дає мені точного% (порівняння з htop)
lepe

1
Вам потрібно використовувати vmstat 1 2так: echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] інакше ви vmstatзбираєтеся давати значення з моменту завантаження, що, ймовірно, не те, що ви шукаєте.
Джо

Джо, дякую, це працює. будь ласка, Павло, відредагуйте відповідь, щоб усі бачили правильний командний рядок
Павлос Теодору

Дякуємо, що це зрозуміли, Джо та Павлос! Я не помітив тієї частини чоловічої сторінки.
Павло

9

Це відома проблема с top. Як пояснено тут , 1-а ітерація top -bповертає відсотки після завантаження, тому нам потрібно принаймні дві ітерації ( -n 2), щоб отримати поточний відсоток. Щоб прискорити роботу, ви можете встановити dпроміжок між ітераціями на 0.01. topрозділяє використання процесора між користувачем, системними процесами та niceпроцесами, ми хочемо суму трьох. Нарешті, ви grepвказуєте рядок, що містить відсотки процесора, а потім використовуєте gawkдля підсумовування користувачів, системних та приємних процесів:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode

Кожен інший метод, включаючи sar, mpstat ... і т.д., показує 2/3%, тоді як ця команда завжди показує 50%.
CMCDragonkai

@CMCDragonkai номери повинні змінитися (я щойно перевірив це). Ви впевнені, що правильно скопіювали / вставили? Також зауважте, що в системах з декількома процесорами topбуде повідомлено про% використання у відсотках від одного центрального процесора. Це означає, що ви часто отримуєте набагато більші відсотки. Див. Пункт 9 тут .
terdon

Я думаю, що ця команда може бути не сумісна з моєю системою. Але очевидно, що всі інші методи, які я спробував, отримують мені відсоток 1/2 / 3%, що я бачу, якщо запускаю htop, тоді як ця команда дає мені аномалію.
CMCDragonkai

@CMCDragonkai це через декілька процесорів. Ви можете або отримати число, повернене цим, і розділити на кількість ядер, або ви можете використовувати topв інтерактивному режимі (просто запустіть top) і, потрапивши туди, натисніть I(shift + i), щоб побачити розбиття по ядрах.
тердон

У мене всього 1 процесор.
CMCDragonkai

7

Я спробував декілька способів, але це здається мені найбільш точним:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'

Отримав це звідси


мій linux (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP Сб 19 травня 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) не має стовпця $ 15 (cpu-рядок файлу / proc / stat) : процесор 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou

1
Найкраща відповідь! Спасибі! Моя варіація: cat <(grep 'cpu' / proc / stat) <(сон 0,1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", ($ 13- $ 2 + $ 15- $ 4) * 100 / ($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp

Різниця maXp полягає в тому, що її надрукований округлюється одним десятковим знаком:, що %.1f, на мою думку, є більш читабельним і корисним, якщо ви використовуєте цей вихід в інших сценаріях.
lepe

0

Використовуйте -n2. Це виведе два рядки. Перший раз topдрукує рядок, що не відповідає стану на той момент часу. Потім налаштуйте свій сценарій, щоб ігнорувати перший рядок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.