Страницы

Поиск по вопросам

понедельник, 8 октября 2018 г.

Как вывести в терминале пользователя, самого нагруженного процесса?

Как вывести в терминале пользователя, самого нагруженного процесса?
Пробовал вот так: ps -eo %u | sort -nr -k 1| head -1 Отображает самый большой (по числу) Pid пользователя.
Подскажите, как вывести именно пользователя. Например имеется самый высокий процесс пользователя vasya у которого mem или cpu загружена на 70%.


Ответ

Вопрос интересный.
Если, конечно, я его правильно понял, и ответ не сводится к простому запуску
top
(и при необходимости переключению сортировки клавишей M).
Давайте сначала разберемся с памятью,
это проще:
$ ps axh -o user --sort -vsize | head -n 1 tomcat
Эта команда выведет имя пользователя, который использует больше всего памяти (в данном случае им оказался tomcat). Если хотите подробностей, добавьте колонок: -o user,vsize,cmd
Ключи:
ax - показать все процессы. h - не показывать заголовки. -o user - формат вывода. --sort -vsize - сортировка по занимаемой памяти по убыванию (убывание задается знаком - перед vsize).
Теперь интересное - CPU
Хотелось бы по аналогии использовать ps --sort cpu. Однако man гласит:
CPU usage is currently expressed as the percentage of time spent running during the entire lifetime of a process. This is not ideal,
и это правда не то, что нам нужно, нам-то нужно понять, какой процесс грузит больше всего сейчас
А что с командой top? У нее есть batch mode, казалось бы, top -b -n 1 | head и проблема решена. Однако практика показывает, что при таком запуске top показывает далеко не самую точную информацию. Например, самым тяжелым процессом он может показать самого себя.
Чтобы данные были более достоверны, top нужно поработать некоторое время.
И вот тут приходит решение. Запустим top на несколько итераций, а самый тяжелый процесс возьмем из последней. На помощь призовем awk
Скрипт на awk:
max-user.awk
# инициализация BEGIN { START=999 ; COUNT = 0 }
# Как только видим Tasks в начале строки, понимаем, # что top выодит новую порцию данных. # Первая строка с процессом находится на 6 строк дальше. /^Tasks/ { START = NR + 6 }
# 7-я строка - это заголовок. Выведем для красоты. NR == 7 { print }
# Наконец-то строка с нашим процессом. Посчитаем итерацию # и выведем текущее состояние. NR == START { COUNT++; print }
# Прошло 3 итерации, достаточно. COUNT == 3 { exit }
Запускать так:
$ top -b -n 10 -d 1 | awk -f max-user.awk
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 16235 cronfy 20 0 43216 3828 3196 R 12,5 0,1 0:00.02 top 3070 olenka 20 0 4640760 997152 39036 S 3,0 13,1 24:59.97 java 5099 olenka 20 0 859700 135380 70324 S 2,9 1,8 10:45.65 chrome
В последней строке (не в первой!) видим самый грузящий процесс. Получить имя пользователя можно так:
$ top -b -n 10 -d 1 | awk -f max-user.awk | awk 'END { print $2 }' root
Ключи top:
-b - неинтерактивный режим. -n 10 - количество итераций. Можно поставить много, в любом случае выполнение будет прерывать awk. -d 1 - задержка между итерациями.

Комментариев нет:

Отправить комментарий