команда top -c в Linux для фільтрації процесів, перелічених на основі назви процесів


149
top -c

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

Для прикладу, я хотів би, щоб верхній-якийсь варіант - підрядка імені процесу та верхнього відображає під-файли, що мають лише цю підрядку у своєму імені команди

Відповіді:


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', вони не з’являться вгорі; вам доведеться вийти з вершини та запустити цю команду
eugenevd

1
Як сказав eugenevd, це не буде працювати для нових процесів, розпочатих після виклику вершини. Чи можна це зробити? Мені потрібно запустити кілька програм з однаковим префіксом на його ім’я, і я хотів би побачити, скільки з них працює в прямому ефірі, не потрібно кожного разу виконувати новий верх (або просто PS).
Єстер

1
@ Jester, eugenevd, у мене була така ж проблема, як і ти. Я створив нову версію на сайті 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'. І це показує нові процеси.
Авраам TS

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

92

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


2
Це краще рішення, ніж прийнята відповідь (це рішення поставлене на 3 роки пізніше оригіналу). На відміну від оригіналу, це рішення фактично працює і на щойно породжені процеси. Дуже важливо, якщо ви відстежуєте процеси Apache, які створюються на вимогу.
Нейт Лемптон

2
Дійсно, краще рішення, оскільки воно фільтрує живі. Прийняте рішення вирішує ідентифікатори процесу перед запуском зверху. Результат цього процесу, як top -c -p 920,1345,1346фіксований.
Jérôme Gillard

4
Використання oяк фільтра не існує в деяких (старих) версіях верху: top: procps version 3.2.8Користувацький фільтр існує, так що це працює.
Манве

13

Команда @ perreal чудово працює! Якщо ви забудете, спробуйте в два кроки ...

приклад: верхній фільтр для відображення лише програми під назвою yakuake:

$ pgrep yakuake
1755

$ top -p 1755

корисні верхні інтерактивні команди 'c': перемикайте повний шлях проти назви команди 'k': вбиваємо PID 'F': фільтруємо по ... вибираємо стрілками ... потім натискаємо 's', щоб встановити сортування

відповідь нижче також хороша ... Я шукав це сьогодні, але не зміг його знайти. Дякую


7

Шукаючи стільки відповідей на StackOverflow, я не побачив відповіді, щоб відповідати моїм потребам.

Тобто, щоб зробити верхню команду, щоб продовжувати оновлюватись заданим ключовим словом, і нам не доведеться знову і знову 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;)

Змініть __keyword і воно повинно працювати. (Перевірено 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;)

тут відсутній огляд щодо завантаженості системи. додайте "час безперервного часу" перед сном, для коротких списків процесів цього достатньо для ІМХО.
Севільс

1
@Sevyls Дякую за вказівку! Після інших кількох спроб (які не так добре працюють) ваша версія може бути однією з найкращих. Відповідь змінена
Валь

Чудово працює, якщо у мене є один або декілька процесів, які виконують цю відповідність, але я отримую "top: Invalid user", коли всі зупиняються Він відновляється, коли починається інший процес. Я біжу на Raspbian FYI. Дякую.
Майк

1

як що до цього?

top -c -p <PID>

4
ми намагаємось відфільтрувати ім’я процесу (або його підрядку), і коли ви перезапустите процес, ви отримаєте новий під.
Srujan Kumar Gulla

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

1

У ньому htopви можете просто здійснити пошук

/process-name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.