Команда top -c в linux для фильтрации процессов, перечисленных на основе имени процесса


149
top -c

В верхнем списке перечислены все процессы, есть хорошие опции для фильтрации процессов по имени пользователя с помощью опции -u, но мне интересно, есть ли какой-нибудь простой способ фильтрации процессов по имени процесса, указанному в столбце COMMAND верхнего вывода.

Например, я хотел бы, чтобы top -some опция -substring имя процесса и top отображал pids только с этой подстрокой в ​​имени команды

Ответы:


214

Использование pgrep для получения pid соответствующих командных строк:

top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line)

top -pожидает список pids через запятую, поэтому мы используем -d','в pgrep. -fФлаг в pgrep делает матч командной строки вместо имени программы.


12
просто помните, что если для 'string_to_match_in_cmd_line' создаются новые процессы, они не будут отображаться сверху; вам придется выйти из top и снова запустить эту команду
eugenevd

1
Как сказал Евгений, это не будет работать для новых процессов, запущенных после вызова top. Есть ли способ сделать это? Мне нужно запустить несколько программ с одинаковым префиксом в названии, и я хотел бы посмотреть, сколько из них работает в прямом эфире, без необходимости каждый раз выполнять новый топ (или просто ps).
Шут

1
@Jester, Евгений, у меня была такая же проблема, как и у тебя. Я сделал новую версию на stackoverflow.com/a/27653841/681830 , надеюсь, это поможет.
Вэл

5
Я сталкивался , top: pid limit (20) exceededтак что я использовал это: top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01

115

Это можно сделать в интерактивном режиме

После запуска top -cнажмите oи напишите фильтр в столбце, например, чтобы показать строки, где столбец COMMAND содержит строку foo, writeCOMMAND=foo

Если вы просто хотите получить базовый вывод, этого может быть достаточно:

top -bc |grep name_of_process

7
Это дает мне 'недопустимый параметр или синтаксис: -bc'
shmim

3
top -bc -n 1 удобнее, так как ограничивает количество итераций до 1.
Галат

1
Это должен быть принятый ответ. Он более точный и работает только с параметрами, предоставленными командой top. И это действительно показывает новые процессы.
Авраам Т.С.

Процессы продолжают исчезать и появляться снова top -c , hit o and write a filter on a column.
MrR

92

Вы можете добавить фильтры во topвремя его работы, просто нажмите oклавишу и введите выражение фильтра. Например, для мониторинга всех процессов Java используйте выражение фильтра COMMAND=java. Вы можете добавить несколько фильтров, нажав клавишу еще раз, вы можете фильтровать по пользователю с помощью uклавиши, и вы можете очистить все фильтры с помощью =клавиши.


2
Это лучшее решение, чем принятый ответ (это решение поставлено на 3 года позже, чем оригинал). В отличие от оригинала, это решение на самом деле работает и для новых процессов. Очень важно, если вы отслеживаете процессы Apache, которые создаются по требованию.
Нейт Лэмптон,

2
Действительно лучшее решение, потому что оно фильтрует в реальном времени. Принятое решение разрешает идентификаторы процесса перед запуском top. Результирующий процесс подобен top -c -p 920,1345,1346фиксированному.
Жером Жиллар

4
Использование oв качестве фильтра не существует в некоторых (более старых) версиях top: top: procps version 3.2.8Фильтр пользователя существует, поэтому он работает.
Manwe

13

Команда @ Perreal прекрасно работает! Если вы забыли, попробуйте в два этапа ...

пример: фильтр сверху отображает только приложение с именем yakuake:

$ pgrep yakuake
1755

$ top -p 1755

полезные верхние интерактивные команды 'c': переключение полного пути и имени команды 'k': уничтожение по PID 'F': фильтрация по ... выберите стрелками ... затем нажмите 's', чтобы установить сортировку

Ответ ниже тоже хорош ... Я искал это сегодня, но не смог его найти. Спасибо


7

После поиска стольких ответов в StackOverflow я не нашел ответа, соответствующего моим потребностям.

То есть, чтобы команда top продолжала обновляться с заданным ключевым словом, и нам не нужно снова и снова CTRL + C / top, когда появляются новые процессы.

Таким образом, я делаю новый ...

Здесь идет не требующая перезагрузки версия.

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; sleep 1; done;)

Измените ключевое слово __, и оно должно работать. (Ubuntu 2.6.38 протестирован)

2.14.2015 добавлено: часть рабочей нагрузки системы отсутствует с кодом выше. Для людей, которые заботятся о «средней нагрузке»:

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; uptime; sleep 1; done;)

в нем отсутствует обзор рабочей нагрузки системы. добавьте «uptime» перед сном, для коротких списков процессов этого ИМХО достаточно.
Севильс

1
@Sevyls Спасибо за указание! После нескольких других попыток (которые работают не так хорошо, как) ваша версия может оказаться одной из лучших. Ответ изменен.
Val

Прекрасно работает, если у меня запущен один или несколько процессов, которые соответствуют, но я получаю «top: Invalid user», когда все останавливаются. Он восстанавливается при запуске другого процесса. Я бегу по Raspbian FYI. Спасибо.
Майк

1

как насчет этого?

top -c -p <PID>

4
мы пытаемся выполнить фильтрацию по имени процесса (или его подстроке), и при перезапуске процесса вы получите новый pid.
Сружан Кумар Гулла

1

В итоге я использовал скрипт оболочки со следующим кодом:

#!/bin/bash

while [ 1 == 1 ]
do
    clear
    ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
    sleep 5
done

1

Большинство ответов здесь не удаются, когда список процессов превышает 20 процессов. Это top -pпредел возможностей. Для тех, у кого более старая вершина, которая не поддерживает фильтрацию с oопциями, вот пример сценария для получения полного экрана / вывода консоли (сводная информация отсутствует в этих выходных данных).

__keyword="YOUR_FILTER" ; ( FILL=""; for i in  $( seq 1 $(stty size|cut -f1 -d" ")); do FILL=$'\n'$FILL; done ;  while :; do HSIZE=$(( $(stty size|cut -f1 -d" ")  - 1 ));  (top -bcn1 | grep "$__keyword"; echo "$FILL" )|head -n$HSIZE; sleep 1;done )

Некоторые объяснения

__keyword = your grep filter keyword
HSIZE=console height
FILL=new lines to fill the screen if list is shorter than console height
top -bcn1 = batch, full commandline, repeat once

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.