#linux #ubuntu #unix
Как вывести в терминале пользователя, самого нагруженного процесса? Пробовал вот так: ps -eo %u | sort -nr -k 1| head -1 Отображает самый большой (по числу) Pid пользователя. Подскажите, как вывести именно пользователя. Например имеется самый высокий процесс пользователя vasya у которого mem или cpu загружена на 70%.
Ответы
Ответ 1
Вопрос интересный. Если, конечно, я его правильно понял, и ответ не сводится к простому запуску 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 - задержка между итерациями.Ответ 2
Вот на Питоне кросс-платформенный вариант: #!/usr/bin/env python import time import psutil for process in psutil.process_iter(): process.cpu_percent() # ignore time.sleep(1) # averaging interval in seconds print(max(psutil.process_iter(), key=psutil.Process.cpu_percent).username()) Скрипт: перебирает все запущенные процессы и вызывает cpu_percent(), чтобы обозначить время, с которого статистика будет считаться (возвращаемое значение первого вызова бессмысленно) спит 1 секунду — время, по которому утилизация CPU усредняется для каждого процесса. Поправьте для своих нужд. находит процесс с наибольшей долей CPU за прошедшее (одна секунда) время и печатает соответствующее имя пользователя. Для работы необходимо поставить psutil зависимость, к примеру, на Ubuntu: $ sudo apt-get install python-psutil Или если не хочется трогать систему, то только для текущего пользователя можно поставить: $ pip install --user psutil См. Как запускать файл Python из любого места в Ubuntu?
Комментариев нет:
Отправить комментарий