top -c polecenie w systemie Linux do filtrowania procesów wymienionych na podstawie nazwy procesu

149
top -c

Na początku wyświetla listę wszystkich procesów, są dobre opcje filtrowania procesów według nazwy użytkownika za pomocą opcji -u, ale zastanawiam się, czy istnieje łatwy sposób filtrowania procesów na podstawie nazwy procesu wymienionej w kolumnie POLECENIE w górnym wyjściu.

Na przykład chciałbym, aby górna opcja -substring nazwy procesu i top wyświetla pidy mające tylko ten podciąg w nazwie polecenia

Alex
źródło

Odpowiedzi:

214

Użycie pgrep do uzyskania pidów pasujących linii poleceń:

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

top -poczekuje listy pidów oddzielonych przecinkami, więc używamy -d','w pgrep. -fFlagi pgrep sprawia, że pasuje do wiersza poleceń zamiast nazwy programu.

perreal
źródło
12
pamiętaj tylko, że jeśli pojawią się nowe procesy dla „string_to_match_in_cmd_line”, nie pojawią się one na górze; musiałbyś wyjść z góry i ponownie uruchomić to polecenie
eugenevd
1
Jak powiedział eugenevd, to nie zadziała dla nowych procesów uruchomionych po wywołaniu szczytu. Czy można to zrobić? Potrzebuję uruchomić kilka programów z tym samym prefiksem w nazwie i chciałbym zobaczyć, ile z nich działa na żywo, bez konieczności wykonywania za każdym razem nowego topu (lub tylko ps).
Jester
1
@Jester, eugenevd, miałem ten sam problem co ty. Zrobiłem nową wersję na stackoverflow.com/a/27653841/681830 , mam nadzieję, że to pomoże.
Val
5
I napotkał top: pid limit (20) exceededwięc użyłem to: top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01
115

Można to zrobić interaktywnie

Po uruchomieniu top -cnaciśnij oi napisz filtr na kolumnie, np. Aby wyświetlić wiersze, w których kolumna COMMAND zawiera ciąg foo, napiszCOMMAND=foo

Jeśli potrzebujesz tylko podstawowych danych wyjściowych, może to wystarczyć:

top -bc |grep name_of_process
nr
źródło
7
To daje mi „niepoprawną opcję lub składnię: -bc”
shmim
3
top -bc -n 1 jest wygodniejszy, ponieważ ogranicza liczbę iteracji do 1.
galath
1
To powinna być akceptowana odpowiedź. Jest dokładniejszy i działa tylko z opcjami udostępnianymi przez polecenie „top”. I pokazuje nowe procesy.
Abraham TS
Procesy znikają i pojawiają się ponownie top -c , hit o and write a filter on a column.
MrR
92

Możesz dodawać filtry, topgdy jest uruchomiony, po prostu naciśnij oklawisz, a następnie wpisz wyrażenie filtru. Na przykład, aby monitorować wszystkie procesy Java, użyj wyrażenia filtru COMMAND=java. Możesz dodać wiele filtrów, naciskając ponownie klawisz, możesz filtrować według użytkownika za pomocą uklawisza i możesz wyczyścić wszystkie filtry za pomocą =klawisza.

Don Kirkby
źródło
2
To lepsze rozwiązanie niż przyjęta odpowiedź (to rozwiązanie postawione 3 lata później niż oryginał). W przeciwieństwie do oryginału, to rozwiązanie działa również na nowo utworzonych procesach. Bardzo ważne, jeśli monitorujesz procesy Apache, które są tworzone na żądanie.
Nate Lampton
2
Rzeczywiście lepsze rozwiązanie, ponieważ filtruje na żywo. Zaakceptowane rozwiązanie rozwiązuje identyfikatory procesów przed uruchomieniem w górę. Wynikowy proces jest taki, top -c -p 920,1345,1346który został naprawiony.
Jérôme Gillard
4
Używanie ojako filtra nie istnieje w niektórych (starszych) wersjach top: top: procps version 3.2.8Filtr użytkownika istnieje, więc to działa.
Manwe
13

Polecenie @ perreal działa świetnie! Jeśli zapomnisz, spróbuj w dwóch krokach ...

przykład: filtruj górę, aby wyświetlić tylko aplikację o nazwie yakuake:

$ pgrep yakuake
1755

$ top -p 1755

przydatne górne interaktywne polecenia `` c '': przełącz pełną ścieżkę względem nazwy polecenia `` k '': zabij według PID `` F '': filtruj według ... wybierz strzałkami ... następnie naciśnij `` s '', aby ustawić sortowanie

odpowiedź poniżej też jest dobra ... Szukałem tego dzisiaj, ale nie mogłem go znaleźć. Dzięki

BBW przed Windows
źródło
7

Po wyszukaniu tylu odpowiedzi na StackOverflow nie znalazłem odpowiedzi, która pasowałaby do moich potrzeb.

To znaczy, aby polecenie top było odświeżane z podanym słowem kluczowym i nie musimy raz po raz wciskać CTRL + C / top, gdy pojawiają się nowe procesy.

W ten sposób tworzę nowy ...

Oto wersja bez konieczności ponownego uruchamiania.

__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;)

Zmodyfikuj słowo kluczowe __ i powinno działać. (Testowane Ubuntu 2.6.38)

2.14.2015 dodano: Brak części obciążenia systemu w powyższym kodzie. Dla osób, którym zależy na części „średnie obciążenie”:

__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;)
Val
źródło
brakuje tu przeglądu obciążenia systemu. dodaj „uptime” przed uśpieniem, dla krótkich list procesów wystarczy IMHO.
Sevyls
1
@Sevyls Dzięki za wskazanie! Po kilku innych próbach (które nie działają tak dobrze, jak) Twoja wersja może być jedną z najlepszych. Odpowiedź zmodyfikowana.
Val
Działa świetnie, jeśli mam jeden lub więcej procesów działających w tym dopasowaniu, ale po zatrzymaniu wszystkich otrzymuję komunikat „top: Invalid user”. Odzyskuje się, gdy rozpoczyna się inny proces. Korzystam z Raspbian FYI. Dzięki.
Mike
1

a co z tym?

top -c -p <PID>
Satish
źródło
4
próbujemy filtrować według nazwy procesu (lub jej podciągu), a po ponownym uruchomieniu procesu otrzymasz nowy pid.
Srujan Kumar Gulla
1

Skończyło się na użyciu skryptu powłoki z następującym kodem:

#!/bin/bash

while [ 1 == 1 ]
do
    clear
    ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
    sleep 5
done
Błazen
źródło
1

Większość odpowiedzi zawodzi tutaj, gdy lista procesów przekracza 20 procesów. To jest top -plimit opcji. Dla tych ze starszym topem, który nie obsługuje filtrowania z oopcjami, oto przykład skryptu, aby uzyskać pełny ekran / konsolę outuput (w tym wyniku brakuje informacji podsumowujących).

__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 )

Kilka wyjaśnień

__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
Manwe
źródło
1

W programie htopmożesz po prostu wyszukiwać za pomocą

/process-name
serv-inc
źródło