Ogranicz wyjście polecenia TOP do określonej nazwy procesu

81

Jeśli wywołasz najwyższe polecenie, otrzymasz wszystkie uruchomione procesy. Ale jak mogę ograniczyć dane wyjściowe tylko do określonej nazwy procesu, takiej jak „java” ?

Wypróbowałem ten top -l 2 | grep java, ale w ten sposób otrzymujesz tylko migawki, a nie stale aktualizowaną listę. I górne -l 0 | grep java nie jest do końca jasne.

Alex
źródło
5
Niestety, jak dotąd nadal nie ma poprawnej odpowiedzi, ponieważ -p i -b nie są obsługiwane przez polecenie top systemu OS X.
Alex
Jakie jest być może pierwsze rozwiązanie OSX poniżej - i to w ostatniej chwili;)
Anti Earth

Odpowiedzi:

131

Wolę następujące, więc nadal mogę korzystać z top interaktywnie, bez konieczności sprawdzania pidów za każdym razem, gdy go uruchamiam:

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

Oczywiście, jeśli procesy się zmienią, będziesz musiał ponownie uruchomić polecenie.

Wyjaśnienie:

  • pgrep process-name zwraca listę identyfikatorów procesów, które są oddzielone znakami nowej linii
  • tr "\\n" "," tłumaczy te znaki nowej linii na przecinki, ponieważ top potrzebuje rozdzielonej przecinkami listy identyfikatorów procesów
  • sedto edytor strumieniowy, sed 's/,$//'używany tutaj do usuwania końcowego przecinka
Rick Byers
źródło
2
Najlepsza odpowiedź, ulepsza działanie dogbane, dzięki czemu można wpisać nazwę zamiast wklejać wiele identyfikatorów PID. (I to jest
TAKIE
1
Głosowałbym na ciebie wiele razy, gdybym mógł, myślę, że to naprawdę powinna być „zaakceptowana” odpowiedź.
spuriousdata,
6
Dostaję top: pid limit (20) exceeded. Czy w ogóle istnieje ten limit?
celwell
7
@celwell, spróbuj top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//'). Spowoduje to wyświetlenie danych dla maksymalnie pierwszych 20 identyfikatorów PID zwróconych przez pgrep.
Acumenus
3
Od Yosemite (lub wcześniej?) Jest -pidzamiast -p.
maksymalnie
53

Znajdź pidy procesów, które chcesz monitorować, a następnie skorzystaj z -popcji, która umożliwia podanie listy pidów do toppolecenia.

Przykład:

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

(Myślę, że możesz również przekazać listę oddzieloną przecinkami).

dogbane
źródło
7
Na Macu powinno to być „top -pid ID”, ale proces Java może mieć kilka różnych identyfikatorów, ponieważ może istnieć kilka procesów Java.
Alex
32

co powiesz na top -b | grep java

Faisal Feroz
źródło
1
Nie działa na Macu, ponieważ Mac używa narzędzi BSD, a nie narzędzi GPL. Jest kilka różnic. Przypuszczam, że wersja „-b” jest podobna do „-l 0”, ale drukowany jest także nagłówek tabeli?
Alex
29

Rozwijając odpowiedź @ dogbane , możesz pobrać wszystkie PIDy dla nazwanego procesu, pgrepaby wykonać następujące czynności:

top -p "$(pgrep -d ',' java)"
l0b0
źródło
2
To ma maksymalny limit 20 pids
pan
top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
pan
Masz rację! man topmówi: „Tę opcję można podać maksymalnie 20 razy lub możesz podać listę rozdzielaną przecinkami z maksymalnie 20 pidami”. Cholera.
l0b0
6

Użyj polecenia watch

watch -d 'top -n1 | grep mysql'
tszming
źródło
Powinno być „patrz - d”. Jednak nie otrzymuję danych wyjściowych podczas wykonywania tego polecenia.
Alex
-1:: man watch" watch uruchamia polecenie wielokrotnie, wyświetlając jego wyjście i błędy "; nie pokazuje aktualnie uruchomione procesy jak toprobi
sdaau
@AlexanderOrlov, nie ma tu żadnej specjalnej magii, po prostu użyj górnego -n1, aby wydrukować i wyjść, i użyj zegarka do ciągłego monitorowania.
tszming
@sdaau, Twój komentarz nie ma związku z moją odpowiedzią, następnym razem odpowiedz uważniej.
tszming
1
Myślę, że powinniśmy dodać opcje -b. watch -d 'top -b -n1 | grep mysql'
Reyes Yang
6

Korzystając z odpowiedzi tutaj , udało mi się stworzyć jedną wkładkę

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

To działa dla mnie na MacOS 10.12 (Sierra)

bcjenkins
źródło
2

Rozwiązałem swój problem używając:

do góry -n1 -b | grep "nazwa procesu"

w tym przypadku: -n służy do ustawiania, ile razy top will, jaki proces
i -b jest używany do wyświetlenia wszystkich pidów

zapobiega błędom takim jak: top: przekroczono limit pid (20)

Markomafs
źródło
2

Poniższy kod aktualizuje listę procesów co 5 sekund za pomocą polecenia watch:

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

gnod
źródło
2

Prowadzę to (np.): top -b | egrep -w 'java|mysqld'

Alessandro Nizzo
źródło
1

Załóżmy, że jeśli mamy więcej niż 20 procesów uruchomionych na serwerze o tej samej nazwie ... to nie pomoże

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

Spróbuje wymienić i dostarczyć w czasie rzeczywistym 20 procesów, w których mamy dużą szansę na pominięcie innych procesów, które pochłaniają więcej zasobów ....

Wciąż szukam lepszej opcji w tej sprawie

user3482072
źródło
0

Bardziej konkretny przypadek, którego szukałem:

W przypadku procesów Java możesz również użyć, jps -qgdzie jps jest narzędziem z $ JAVA_HOME / bin i dlatego powinno znajdować się w $ PATH.

Alex
źródło
0

Przyszedłem tutaj, szukając odpowiedzi na to w OSX. Skończyło się na tym, że otrzymałem to, co chciałem, dzięki bash i 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
}

Pętlę w górę w trybie logowania i filtruję za pomocą awk, budując tablicę asocjacyjną z danych wyjściowych pgrep. Awk wypisuje pierwsze 12 wierszy, gdzie 12. wiersz to nagłówki kolumn, a następnie każdy wiersz zawierający pid będący kluczem w tablicy. Plik zrzutu jest używany do bardziej widocznej pętli.

aktivb
źródło
W OSX możesz użyć czegoś takiego jak pgrep <process_name>; top -pid <pid_specified_by_pgrep>
bergercookie
0

po prostu top -bn 1 | grep javazałatwi sprawę za Ciebie

Guru
źródło
0

Uruchomienie poniższego zapewni ciągłą aktualizację w konsoli:

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
Ayyappa Boligala
źródło
0

Oto jedyne jak dotąd rozwiązanie dla MacOS:

top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

chociaż będzie to niepożądane, invalid option or syntax: -pidjeśli nie ma javaaktywnych procesów.

WYJAŚNIENIE

Inne zamieszczone tutaj rozwiązania używają formatu top -p id1,id2,id3, ale MacOS topobsługuje tylko nieporęczny format top -pid id1 -pid id2 -pid id3.

Najpierw otrzymujemy listę identyfikatorów procesów, które mają nazwę procesu „java”:

pgrep java

i awkprzekazujemy to, co łączy wyniki z separatorem" -pid "

| awk 'ORS=" -pid "'

Niestety, to pozostawia końcowy separator! Na przykład, do tej pory mogliśmy uzyskać ciąg "123 -pid 456 -pid 789 -pid ".

Następnie po prostu sedusuwamy ostatnie 6 znaków separatora.

| sed 's/.\{6\}$//'`

Jesteśmy gotowi przekazać wyniki do top:

top -pid `...`
Anti Earth
źródło
0

pobierz pid procesu:

# pidof <process>

powiedz topowi, jakie pid (y) procesów ma wyświetlić

# top -p <pid1>,<pid2>, etc

przykład:

landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709

Top wyświetli tylko 2 procesy „konsoli”. Jest to przydatne na zajętym serwerze przez ssh, bez konieczności przechodzenia przez grep.

Landis Reed
źródło
przepraszam, nie widziałem kwestionowanego tagu macos. mój działa na wszystkich moich linuxach.
Landis Reed
-1

Stosując podejście wspomniane w odpowiedzi Ricka Byersa:

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

ale miałem uruchomionych ponad 20 procesów, więc poniższe polecenie może być pomocne dla kogoś, kto napotka podobną sytuację.

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

pgreppobiera listę procesów o podanej nazwie - w tym przypadku java. headjest używany do pobrania pierwszych 20 pidów, ponieważ top nie może obsłużyć więcej niż 20 pidów przy użyciu argumentu -p. Wreszcie pastedołącza do listy pidów ze znakiem „,”.

Możesz kontrolować nazwę procesu, którego szukasz w powyższym poleceniu i liczbę procesów o tej nazwie, które chcesz obserwować. Możesz zignorować head -n 20część, jeśli liczba procesów o podanej nazwie jest mniejsza niż 20.

shaffooo
źródło