Как просмотреть определенный процесс сверху

48

Существуют ли относительно простые варианты с top для отслеживания определенного процесса?
В идеале, идентифицируя процесс по человечески понятному значению? например chromeили java.

Другими словами, я хочу просмотреть всю типичную информацию, которую предоставляет топ, но результаты должны быть отфильтрованы по предоставленным параметрам, т.е. «хром» или «Java»

Майкл Коулман
источник
1
ты пробовал top | grep chrome?
Pandya
1
Вы также можете использовать, ps -x | chromeчтобы получить pid (пусть pid показан 2034), а затемtop | grep 2034
Pandya
top | grep chromeработал отлично - спасибо!
Майкл Коулман
@Pandya - также, процесс, который я искал, запускался всего несколько секунд (node.js во время интеграционного теста) - это означало, что когда я использовал ps -x | process_nameдля получения PID, когда я снова запускал процесс, PID был другим, и поэтому Оригинальный PID не будет идентифицировать это.
Майкл Коулман

Ответы:

25

Вы можете просто использовать grep:

NAME
       grep, egrep, fgrep, rgrep - print lines matching a pattern

SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

DESCRIPTION
       grep  searches  the  named  input  FILEs (or standard input if no files are named, or if a single
       hyphen-minus (-) is given as file name) for lines containing a match to the  given  PATTERN.   By
       default, grep prints the matching lines.

Запустите следующую команду, чтобы получить желаемый вывод (ex-chrome):

top | grep chrome

Здесь мы используем grepс конвейерами, |поэтому top& grepзапустить параллельно; topвывод данных grep(в качестве ввода) и grep chromeфильтрация совпадающих строк chromeдо topостановки.

Pandya
источник
1
спасибо, я знаю, что другие люди имеют свои предпочтения, но мне нравится этот ответ, потому что его легко понять, и, следовательно, его легче запомнить в будущем! - Я бы проголосовал, но мне не хватает репутации ...
Майкл Коулман
3
Это работает только в том случае, если процесс отображается в верхнем выводе. Я думаю , что @ ответ Рамеша должен быть принят один
JB
@JamieBullock вопрос касается topтолько и OP хотят фильтровать процесс на основе top.
Pandya
@Pandya на самом деле, я забрал свой предыдущий комментарий, так как он был основан на ошибке в моем коде. Тем не менее, я думаю, что ответ @ Ramesh лучше (а также фильтрует процесс на основе топа). Я могу легко сломать ваши , например , сsleep 10 & top | grep sleep
JB
Мне больше нравится unix.stackexchange.com/a/165343/48973, потому что он показывает заголовки.
Райан
39

Из моего другого ответа здесь , вы могли бы сделать что-то вроде,

top -p `pgrep "java"`
Рамеш
источник
4
top -p `pgrep "java"`дает мне следующую ошибку в оболочке bash top: -p requires argument. top -ppgrep -d ',' "apache2" сработал для меня, но я не совсем понял, что делает команда - это способ подачи нескольких аргументов в начало?
Майкл Коулман
@Ramesh вам нужно дать pidзапятую списка, отделенную для работы.
Каннан Мохан
3
Это правильный ответ.
j03m
1
+1 Это правильный ответ. "top | grep Chrome" довольно варварский, потому что он вытесняет ВСЕ ВЫХОДЫ из верха, не соответствующего "Chrome", теряя такие вещи, как заголовки и метки столбцов. Использование подоболочки с выводом из pgrep является правильным применением философии Unix.
Джон М Наглик
2
@loretoparisi, возможно, потому, что используемый вами селектор соответствует нескольким процессам. Посмотрите этот ответ для команды, которая работает с одним или несколькими соответствующими процессами.
Майкл Хейс
21
top -p `pgrep -d "," java`

Объяснение:

  1. top -p pid1,pid2: показать информацию о нескольких процессах, pid должен быть разделен ,
  2. pgrep -d "," java: печатать pids всех java-программ, pids по умолчанию разделены новой строкой. используйте, -d ","чтобы отделить его, ,как того требует верх.

Если вы видите ошибку как top: -p argument missing, это означает, что Java-программа не запущена, т.е. pgrep не имеет выходных данных.

Минцзян Ши
источник
1
Это решение работает лучше, чем использование top -p pgrep "java" `` только. благодарю вас.
Лоретопариси
1
Предотвратите ошибку, проверив pgrepкод выхода:pids="$(pgrep -d, java)" && top -p "$pids"
Syme
12

В OpenBSD topпросто нажмите gи введите имя команды, по которой вы хотите выполнить фильтрацию.

В topна Ubuntu , например, нажмите oи введите , например , COMMAND=chromeчтобы показывать только записи из COMMANDстолбца, равны chrome.

В Linux, в которых используется та же topреализация, что и в Ubuntu, прочитайте раздел ФИЛЬТРАЦИЯ в окне в topруководстве.

Кусалананда
источник
7

Были даны и другие хорошие ответы, но некоторое время назад я написал сценарий, который назвал ptop и который хорошо мне подходит:

#!/bin/sh
top -p $(pidof "$@" |sed s#\ #,#g) 2>/dev/null
if [ $? -ne 0 ]; then
  echo No processes with the specified name\(s\) were found
fi

Это поддерживает указание нескольких имен процессов (например ptop bash chrome) и предоставляет более приятное сообщение об ошибке в случае, если нет ни одного из процессов с запущенными указанными именами.

Marcelo
источник
3

Если вы хотите остаться в topкурсе и держать все остальные процессы в поле зрения контекста, вы можете нажать Lдля поиска вашего процесса:

Locate string chrome

Это выделит любой процесс chromeв названии и отобразит его. Используйте, &чтобы перейти к следующему матчу.

Вы можете нажать cдля переключения между отображением имени процесса и полной команды.

Йонатан
источник
Это ^ потому что люди RTFM! man top | less +/5d
cprn
0

Вы также можете использовать фильтр сверху, чтобы изолировать определенные процессы. Нажмите «O», чтобы вызвать подсказку фильтра. Затем введите фильтр в формате FIELD = значение. Например, чтобы отфильтровать все процессы tmux, используйте:

COMMAND=tmux

Используйте '=' для сброса фильтров. См. Раздел «ФИЛЬТРИРОВАНИЕ» на главной странице руководства.

Гиероид Мерфи
источник