Ограничьте вывод команды TOP определенным именем процесса - PullRequest
78 голосов
/ 16 сентября 2010

Если вы вызываете команду top, вы получаете все запущенные процессы.Но как я могу ограничить вывод только определенным именем процесса, например "java" ?

Я пробовал это top -l 2 |grep java но таким образом вы получаете только снимки, а не постоянно обновляемый список.И top -l 0 |grep java не совсем понятно.

Ответы [ 16 ]

129 голосов
/ 16 декабря 2011

Я предпочитаю следующее, так что я все еще могу использовать top в интерактивном режиме, не просматривая pids каждый раз, когда я запускаю его:

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`

Конечно, если процессы изменятся, вам придется повторно запустить команду.

Пояснение:

  • pgrep process-name возвращает список идентификаторов процессов, разделенных символами новой строки
  • tr "\\n" "," переводит эти новые строки в запятые, потому что top хочет разделить запятыми список идентификаторов процессов
  • sed - это потоковый редактор, а sed 's/,$//' используется здесь для удаления запятой
53 голосов
/ 16 сентября 2010

Найдите pids процессов, которые вы хотите отслеживать, и затем используйте опцию -p, которая позволяет предоставить список pids для команды top.

Пример:

top -p 18884 -p 18892 -p 18919

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
18884 user  25   0  672M  95M  9476 S     0.0  1.1   0:02   1 java
18892 user  25   0 2280M 123M 12252 S     0.0  1.5   0:05   1 java
18919 user  22   0 1492M 198M 28708 S     0.0  2.4   0:07   1 java

(Полагаю, вы также можете передать список через запятую.)

31 голосов
/ 16 сентября 2010

как насчет top -b |grep java

28 голосов
/ 15 мая 2013

Расширяя ответ @ dogbane , вы можете получить все PID для именованного процесса с помощью pgrep для выполнения следующих действий:

top -p "$(pgrep -d ',' java)"
6 голосов
/ 16 сентября 2010

Используйте команду watch

watch -d 'top -n1 | grep mysql'
4 голосов
/ 09 января 2017

Используя ответ от здесь Мне удалось создать один лайнер

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

Это работает для меня на MacOS 10.12 (Sierra)

2 голосов
/ 01 сентября 2015

Я запускаю его (например): top -b | egrep -w 'java|mysqld'

2 голосов
/ 18 июня 2014

Следующий код обновляет список процессов каждые 5 секунд с помощью команды watch:

watch -n 5 -t top -b -n 1 -p$(pgrep java | head -20 | tr "\\n" "," | sed 's/,$//')

2 голосов
/ 25 февраля 2014

Я решил свою проблему, используя:

top -n1 -b |grep "имя процесса"

в этом случае: -n используется, чтобы указать, сколько раз будет top, какой процесс
и -b используется, чтобы показать все pids

предотвращает такие ошибки, как: top: предел pid (20) превышен

1 голос
/ 31 марта 2014

Предположим .. если у нас более 20 процессов, запущенных на сервере с тем же именем ... это не поможет

top -p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'

Он попытаетсяперечислите и предоставьте в режиме реального времени вывод 20 процессов, где у нас есть хорошие шансы пропустить другие процессы, которые потребляют больше ресурсов ....

Я все еще ищу лучший вариант для этого

...