it-roy-ru.com

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

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

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

76
Alex

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

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

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

Объяснение:

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

Найдите 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

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

53
dogbane

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

31
Faisal Feroz

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

top -p "$(pgrep -d ',' Java)"
28
l0b0

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

watch -d 'top -n1 | grep mysql'
6
tszming

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

3
Alessandro Nizzo

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

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

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

3
bcjenkins

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

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

2
gnod

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

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

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

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

2
Markomafs

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

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

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

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

1
user3482072

Запуск ниже даст непрерывное обновление в консоли:

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
Ayyappa Boligala

просто top -bn 1 | grep Java сделает все за вас

0
Guru

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

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

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

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

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

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

0
shaffooo

Я пришел сюда в поисках ответа на это на 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 ' ' [email protected])" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}

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

0
aktivb

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

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

0
Alex

Вот решение only для 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
Anti Earth