Ограничьте вывод команды TOP конкретным именем процесса

81

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

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

Alex
источник
5
К сожалению, до сих пор нет правильного ответа, поскольку -p и -b не поддерживаются верхней командой OS X.
Alex
Я опубликовал то, что может быть первым решением OSX ниже - и как раз в самый последний момент;)
Anti Earth

Ответы:

131

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

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

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

Пояснение:

  • pgrep process-name возвращает список идентификаторов процессов, разделенных символами новой строки
  • tr "\\n" "," переводит эти новые строки в запятые, потому что top хочет список идентификаторов процессов, разделенных запятыми
  • sedявляется редактором потока, и sed 's/,$//'используется здесь для удаления конечной запятой
Рик Байерс
источник
2
Лучший ответ, улучшает собачье убийство, так что вы можете фактически ввести имя, а не вставлять много PID. (И это ТАК)
sabgenton
1
Я бы проголосовал за вас несколько раз, если бы мог, это действительно должен быть "принятый" ответ, я думаю.
spuriousdata
6
Я получаю top: pid limit (20) exceeded. Есть ли способ обойти этот предел?
Celwell
7
@celwell, попробуйте top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//'). Это покажет данные для первых 20 PID, возвращенных pgrep.
Acumenus
3
В Йосемити (или раньше?) Это -pidвместо -p.
max
53

Найдите идентификаторы процессов, которые вы хотите отслеживать, а затем используйте -pпараметр, который позволяет вам предоставить список идентификаторов процессам.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

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

кендырь
источник
7
На Mac это должен быть «top -pid ID», но процесс Java может иметь несколько разных идентификаторов, поскольку может быть несколько процессов Java.
Alex
32

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

Фейсал Фероз
источник
1
Не работает на Mac, потому что Mac использует инструменты BSD, а не инструменты GPL. И есть некоторые отличия. Полагаю, версия "-b" похожа на "-l 0", но печатается также заголовок таблицы?
Алекс
29

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

top -p "$(pgrep -d ',' java)"
l0b0
источник
2
Максимальный лимит - 20 pid
mrP
top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
mrP
Вы правы! man topговорит: «Эта опция может быть указана до 20 раз, или вы можете предоставить список с разделителями-запятыми, содержащий до 20 идентификаторов». Черт возьми.
l0b0 07
6

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

watch -d 'top -n1 | grep mysql'
Цзмин
источник
Должно быть "смотреть --d". Однако при выполнении этой команды я не получаю никаких результатов.
Alex
-1:: man watch" watch запускает команду несколько раз, отображая ее вывод и ошибки "; он не показывает запущенные в данный момент процессы, как это topделает
sdaau
@AlexanderOrlov, здесь нет особой магии, просто используйте top -n1 для печати и выхода и используйте часы для постоянного наблюдения.
tszming
@sdaau, ваш комментарий не имеет отношения к моему ответу, пожалуйста, ответьте более внимательно в следующий раз.
tszming
1
Я думаю, нам следует добавить параметры -b. watch -d 'top -b -n1 | grep mysql'
Рейес Ян
6

Используя ответ отсюда, я смог создать один лайнер

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

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

Bcjenkins
источник
2

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

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

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

это предотвращает такие ошибки, как: top: pid limit (20) exceeded

Маркомафс
источник
2

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

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

гнод
источник
2

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

Алессандро Низцо
источник
1

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

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

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

Я все еще ищу вариант получше

пользователь3482072
источник
0

Более конкретный случай, который я действительно искал:

Для Java - процессы можно также использовать jps -qпри этом JPS является инструментом от $ JAVA_HOME / бункера и , следовательно , должно быть в вашем $ PATH.

Alex
источник
0

Я пришел сюда в поисках ответа на OSX. В итоге я получил то, что хотел, с помощью bash и awk:

topfiltered() {
  [[ -z "$1" ]] && return
  dump="/tmp/top_dump"
  rm -f "$dump"
  while :; do
    clear
    [[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
    top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}

Я зацикливаюсь в режиме регистрации и фильтрую его с помощью awk, создавая ассоциативный массив из вывода pgrep. Awk печатает первые 12 строк, где строка 12 - заголовки столбцов, а затем каждую строку с идентификатором pid, который является ключом в массиве. Файл дампа используется для более наблюдаемого цикла.

активб
источник
В OSX вы можете использовать что-то вроде pgrep <process_name>; top -pid <pid_specified_by_pgrep>
bergercookie
0

просто top -bn 1 | grep javaсделаю трюк за тебя

Гуру
источник
0

Выполнение нижеприведенного приведет к непрерывному обновлению в консоли:

bcsmc2rtese001 [~]$ echo $SHELL  
/bin/bash  
bcsmc2rtese001 [~]$ top | grep efare  or watch -d 'top | grep efare' or top -p pid
27728 efare     15   0 75184 3180 1124 S  0.3  0.0 728:28.93 tclsh  
27728 efare     15   0 75184 3180 1124 S  0.7  0.0 728:28.95 tclsh
Айяппа Болигала
источник
0

Вот единственное решение для MacOS:

top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

хотя это будет нежелательно сообщать, invalid option or syntax: -pidесли нет активных javaпроцессов.

ОБЪЯСНЕНИЕ

Другие решения, размещенные здесь, используют этот формат top -p id1,id2,id3, но MacOS topподдерживает только громоздкий формат.top -pid id1 -pid id2 -pid id3 .

Итак, во-первых, мы получаем список идентификаторов процессов, которые имеют имя процесса "java":

pgrep java

и мы передаем это, awkкоторое объединяет результаты с разделителем" -pid "

| awk 'ORS=" -pid "'

Увы, остается ограничитель! Например, мы уже могли получить строку "123 -pid 456 -pid 789 -pid ".

Затем мы просто используем sedдля удаления последних 6 символов разделителя.

| sed 's/.\{6\}$//'`

Мы готовы передать результаты top:

top -pid `...`
Анти-Земля
источник
0

получить идентификатор процесса:

# pidof <process>

скажите сверху, какие pid процесса отображать

# top -p <pid1>,<pid2>, etc

пример:

landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709

Вверху будут отображаться только 2 консольных процесса. Это полезно на загруженном сервере через ssh, без необходимости использовать grep.

Лэндис Рид
источник
извините, не видел обсуждаемый тег macos. мой работает на всех моих Linux-боксах.
Лэндис Рид
-1

Используя подход, упомянутый в ответе Рика Байерса:

top -p `pgrep java | paste -sd "," -`

но у меня было запущено более 20 процессов, поэтому следующая команда может быть полезна тем, кто сталкивается с подобной ситуацией.

top -p `pgrep java | head -n 20 | paste -sd "," -`

pgrepполучает список процессов с заданным именем - в данном случае java. headиспользуется для получения первых 20 идентификаторов, потому что top не может обрабатывать более 20 идентификаторов при использовании аргумента -p. Наконец, pasteприсоединяется к списку идентификаторов pid с символом ','.

Вы можете контролировать имя процесса, которое вы ищете, в приведенной выше команде и количество процессов с этим именем, которые вы хотите наблюдать. Вы можете игнорировать head -n 20часть, если количество ваших процессов с данным именем меньше 20.

шаффооо
источник