Ограничьте вывод команды TOP определенным именем процесса
Если вы вызываете команду top, вы получаете все запущенные процессы. Но как я могу ограничить вывод только определенным именем процесса, таким как "Java"?
Я пробовал этот топ -l 2 | grep java, но таким образом вы получаете только снимки, а не постоянно обновляемый список. И топ-л 0 | grep java не совсем понятно.
18 ответов
Я предпочитаю следующее, так что я все еще могу использовать top в интерактивном режиме, не просматривая pids каждый раз, когда я его запускаю:
top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`
Конечно, если процессы изменятся, вам придется повторно запустить команду.
Объяснение:
pgrep process-name
возвращает список идентификаторов процессов, разделенных символами новой строкиtr "\\n" ","
переводит эти новые строки в запятые, потому что top хочет разделить запятыми список идентификаторов процессовsed
это потоковый редактор, иsed 's/,$//'
здесь используется для удаления запятой
Найдите pids процессов, которые вы хотите отслеживать, а затем используйте -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
(Я полагаю, что вы также можете передать список через запятую.)
Расширяя ответ @dogbane, вы можете получить все PID для именованного процесса с помощью pgrep
сделать следующее:
top -p "$(pgrep -d ',' java)"
Используя ответ отсюда, я смог создать один вкладыш
top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')
Это работает для меня на MacOS 10.12 (Sierra)
Следующий код обновляет список процессов каждые 5 секунд с помощью команды watch:
watch -n 5 -t top -b -n 1 -p$(pgrep java | head -20 | tr "\\n" "," | sed 's/,$//')
Я решил свою проблему, используя:
top -n1 -b | grep "имя процесса"
в этом случае:
-n используется, чтобы указать, сколько раз будет происходить процесс top
и -b используется, чтобы показать все pids
это предотвращает ошибки, такие как: top: предел pid (20) превышен
Предположим.. если у нас более 20 процессов, запущенных на сервере с таким же именем... это не поможет
топ-р pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'
Он будет пытаться составить список и обеспечить вывод в реальном времени 20 процессов, где у нас есть хорошие шансы пропустить другие процессы, которые потребляют больше ресурсов....
Я все еще ищу лучший вариант на этом
Вам нужно кормить вывод
pgrep {proc_name}
к
top -pid {pid_No}
. Проблема с
top -pid
это то, что он ожидает
-pid
перед каждым pid, за которым вы хотите следить.
На Mac в zsh я могу справиться с этой проблемой, например, вот так:
top `pgrep proc_name | awk '{printf " -pid %d",$1}'`
Это тоже не идеально, потому что
pgrep
ищет подстроки в именах процессов. Например
pgrep dd
может возвращать результаты для
icdd, hidd, cloudd
и т. д. Вариант
pgrep -x
должен возвращать только точные совпадения (например,
grep -w
). Но у меня это не работает в терминале Mac, хотя это работает на виртуальной машине Ubuntu.
Получить идентификатор процесса:
# 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.
Запуск ниже даст непрерывное обновление в консоли:
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
Более конкретный случай, который я действительно искал:
Для процессов Java вы также можете использовать jps -q
где jps - это инструмент из $JAVA_HOME/bin и, следовательно, должен быть в вашем $PATH.
Вот единственное решение для 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 `...`
Я пришел сюда в поисках ответа на это на 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
}
Я зацикливаю top в режиме логирования и фильтрую его с помощью awk, создавая ассоциативный массив из вывода pgrep. Awk печатает первые 12 строк, где строка 12 - это заголовки столбцов, а затем каждая строка, у которой есть pid - ключ в массиве. Файл дампа используется для более удобного просмотра.
Используя подход, упомянутый в ответе Рика Байерса:
top -p `pgrep java | paste -sd "," -`
но у меня было запущено более 20 процессов, поэтому следующая команда может быть полезна для тех, кто сталкивается с подобной ситуацией.
top -p `pgrep java | head -n 20 | paste -sd "," -`
pgrep
получает список процессов с заданным именем - в данном случае java. head
используется для получения первых 20 пидов, потому что top не может обрабатывать более 20 пидов при использовании аргумента -p. в заключение paste
присоединяется к списку пидов с ','.
Вы можете контролировать имя процесса, которое вы ищете в приведенной выше команде, и количество процессов с этим именем, которые вы хотите просмотреть. Вы можете игнорировать head -n 20
расстаться, если число ваших процессов с данным именем меньше 20.