Обмежте вихід команди TOP конкретним іменем процесу


81

Якщо ви викликаєте верхню команду, ви отримаєте всі запущені процеси. Але як я можу обмежити висновок лише певною назвою процесу, наприклад "java" ?

Я спробував цей топ -l 2 | grep java, але таким чином ви отримуєте лише знімки, а не постійно оновлюваний список. І зверху -l 0 | grep java насправді не зрозумілий.


5
На жаль, поки що немає жодної дійсної відповіді, оскільки -p & -b не підтримуються верхньою командою OS X.
Alex

Я опублікував те, що, можливо, перше рішення для OSX нижче - і в
Anti Earth

Відповіді:


131

Я віддаю перевагу наступному, щоб я все ще міг використовувати інтерактивну верхівку, не шукаючи піди щоразу, коли запускаю:

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

Звичайно, якщо процеси змінюються, вам доведеться повторно запустити команду.

Пояснення:

  • pgrep process-name повертає список ідентифікаторів процесу, які розділені новими рядками
  • tr "\\n" "," перекладає ці нові рядки у коми, оскільки top хоче розділити комами список ідентифікаторів процесу
  • sedє редактором потоку і sed 's/,$//'використовується тут для видалення кінцевої коми

2
Найкраща відповідь, покращує dogbane, так що ви можете фактично вводити ім'я, а не вставляти багато PID. (І це ТАК)
sabgenton

1
Я б проголосував за вас кілька разів, якби міг, це, дійсно, має бути "прийнятою" відповіддю, я думаю.
spuriousdata

6
Я отримую top: pid limit (20) exceeded. Чи є десь така межа?
celwell

7
@celwell, будь ласка, спробуй top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//'). Це покаже дані для перших 20 PID, повернутих pgrep.
Проникність

3
Станом на Йосеміті (або раніше?) Це -pidзамість -p.
максимум

53

Знайдіть 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

(Я вважаю, що ви також можете передати список, відокремлений комами.)


7
На Mac це повинен бути "top -pid ID", але процес Java може мати кілька різних ідентифікаторів, оскільки може бути кілька процесів Java.
Alex

32

як щодо top -b | grep java


1
Не працює на Mac, оскільки Mac використовує засоби BSD, а не інструменти GPL. І є деякі відмінності. Я припускаю, що версія "-b" подібна до "-l 0", але також надрукований заголовок таблиці?
Alex

29

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

top -p "$(pgrep -d ',' java)"

2
Це обмеження максимум 20 pids
mrP

top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
mrP

Ти маєш рацію! man topговорить: "Цей параметр можна отримати до 20 разів, або ви можете надати список, розділений комами, до 20 підів". Ну данг.
l0b0

6

Використовуйте годинник команду

watch -d 'top -n1 | grep mysql'

Має бути "watch --d". Однак я не отримую жодного результату виконання цієї команди.
Алекс

-1:: man watch" годинник запускає команду неодноразово, відображаючи результати та помилки "; він не відображає запущені в даний час процеси, як topце робить
sdaau

@AlexanderOrlov, тут немає особливої ​​магії, просто використовуйте top -n1 для друку та виходу та використовуйте watch для постійного моніторингу.
tszming

@sdaau, твій коментар не має значення для моєї відповіді. Будь ласка, відповідай наступного разу більш ретельно.
tszming

1
Я думаю, нам слід додати параметри -b. watch -d 'top -b -n1 | grep mysql'
Reyes Yang

6

Використовуючи відповідь від звідси, я зміг створити один лайнер

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

Це працює для мене на MacOS 10.12 (Сьєрра)


2

Я вирішив свою проблему за допомогою:

зверху -n1 -b | grep "ім'я процесу"

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

це запобігає таким помилкам, як: top: pid limit (20) перевищено


2

Наступний код оновлює список процесів кожні 5 секунд за допомогою команди watch:

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



1

Припустимо .. якщо у нас на сервері працює більше 20 процесів з однаковим іменем ... це не допоможе

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

Він спробує перерахувати та забезпечити вихід 20 процесів у реальному часі, де ми маємо великі шанси пропустити інші процеси, що споживає більше ресурсів ....

Я все ще шукаю кращого варіанту щодо цього


0

Більш конкретний випадок, як я насправді шукав:

Для процесів Java ви також можете використовувати, jps -qза допомогою чого jps є інструментом з $ JAVA_HOME / bin і, отже, має бути у вашому $ PATH.


0

Я прийшов сюди, шукаючи відповіді на це на 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
}

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


На OSX ви можете використовувати щось на зразок pgrep <ім'я_процесу>; top -pid <pid_specified_by_pgrep>
bergercookie


0

Запуск нижче дасть постійне оновлення в консолі:

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

Ось єдине рішення поки що для 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

отримати pid процесу:

# 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.


вибачте, не бачив тегу macos під питанням. моя працює на всіх моїх Linux-коробках.
Лендіс Рід

-1

Використовуючи підхід, згаданий у відповіді Ріка Байерса:

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

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

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

pgrepотримує список процесів із заданою назвою - java в даному випадку. headвикористовується для отримання перших 20 pids, оскільки top не може обробити більше 20 pids при використанні аргументу -p. Нарешті, pasteприєднується до списку pids з ",".

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

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