comando top -c in linux per filtrare i processi elencati in base al nome processo


149
top -c

Top elenca tutti i processi, ci sono buone opzioni per filtrare i processi in base al nome utente usando l'opzione -u ma mi chiedo se esiste un modo semplice per filtrare i processi in base al nome processo elencato nella colonna COMMAND dell'output principale.

Per esempio, vorrei che l'opzione top -some -substring di nome processo e top display pid avesse solo questa sottostringa nel nome comando

Risposte:


214

Usando pgrep per ottenere i pid delle righe di comando corrispondenti:

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

top si -paspetta un elenco di pid separati da virgola, quindi usiamo -d','in pgrep. Il -fflag in pgrep fa corrispondere alla riga di comando anziché al nome del programma.


12
ricorda solo che se vengono generati nuovi processi per 'string_to_match_in_cmd_line' non verranno visualizzati in alto; dovresti uscire da top ed eseguire nuovamente questo comando
eugenevd

1
Come ha detto eugenevd, questo non funzionerà per i nuovi processi avviati dopo che viene chiamato il top. C'è un modo per farlo? Ho bisogno di eseguire diversi programmi con lo stesso prefisso sul suo nome e mi piacerebbe vedere quanti di loro sono in esecuzione in modo live, non è necessario eseguire ogni volta un nuovo top (o solo un ps).
Jester,

1
@Jester, eugenevd, ho avuto lo stesso problema che hai fatto tu. Ho realizzato una nuova versione su stackoverflow.com/a/27653841/681830 , spero che mi aiuti.
Val

5
Ho incontrato top: pid limit (20) exceededcosì ho usato questo: top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01

115

Può essere fatto in modo interattivo

Dopo l'esecuzione top -c, premi oe scrivi un filtro su una colonna, ad es. Per mostrare le righe in cui la colonna COMMAND contiene la stringa foo, scriviCOMMAND=foo

Se vuoi solo un output di base, questo potrebbe essere sufficiente:

top -bc |grep name_of_process

7
Questo mi dà 'opzione o sintassi non valida: -bc'
shmim,

3
top -bc -n 1 è più conveniente, in quanto limita il numero di iterazioni a 1.
galath,

1
Questa dovrebbe essere la risposta accettata. È più preciso e funziona solo con le opzioni fornite dal comando 'top'. E mostra nuovi processi.
Abraham TS

I processi continuano a scomparire e riapparire top -c , hit o and write a filter on a column.
MrR

92

Puoi aggiungere filtri topmentre è in esecuzione, basta premere il otasto e digitare un'espressione di filtro. Ad esempio, per monitorare tutti i processi Java utilizzare l'espressione di filtro COMMAND=java. Puoi aggiungere più filtri premendo nuovamente il tasto, puoi filtrare per utente con il utasto e puoi cancellare tutti i filtri con il =tasto.


2
Questa è una soluzione migliore della risposta accettata (questa soluzione è stata posta 3 anni dopo rispetto all'originale). A differenza dell'originale, questa soluzione funziona anche su processi appena generati. Molto importante se stai monitorando i processi Apache creati su richiesta.
Nate Lampton,

2
In effetti una soluzione migliore perché filtra dal vivo. La soluzione accettata risolve gli ID di processo prima di eseguire top. Il processo risultante è come quello top -c -p 920,1345,1346che è stato risolto.
Jérôme Gillard,

4
L'uso ocome filtro non esiste in alcune versioni (precedenti) di top: il top: procps version 3.2.8filtro utente esiste, quindi funziona.
Manwe,

13

Il comando di @ perreal funziona alla grande! Se dimentichi, prova in due passaggi ...

esempio: filtro top per visualizzare solo l'applicazione chiamata yakuake:

$ pgrep yakuake
1755

$ top -p 1755

utili comandi interattivi principali 'c': attiva / disattiva percorso completo vs. nome comando 'k': uccidi per PID 'F': filtra per ... seleziona con le frecce ... quindi premi 's' per impostare l'ordinamento

anche la risposta qui sotto è buona ... La stavo cercando oggi ma non riuscivo a trovarla. Grazie


7

Dopo aver cercato così tante risposte su StackOverflow, non ho visto una risposta adatta alle mie esigenze.

Cioè, per fare il comando top per continuare ad aggiornare con una determinata parola chiave, e non dobbiamo CTRL + C / top ancora e ancora quando vengono generati nuovi processi.

Così ne faccio uno nuovo ...

Ecco la versione senza riavvio necessaria.

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

Modifica la __keyword e dovrebbe funzionare. (Ubuntu 2.6.38 testato)

2.14.2015 aggiunto: la parte del carico di lavoro del sistema è mancante con il codice sopra. Per le persone che si preoccupano della parte "carico medio":

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

manca una panoramica del carico di lavoro del sistema. aggiungi "uptime" prima di andare a dormire, per brevi elenchi di processi, questo è IMHO sufficiente.
Sevyls,

1
@Sevyls Grazie per averci segnalato! Dopo altri pochi tentativi (che non funzionano altrettanto bene) la tua versione potrebbe essere una delle migliori. Risposta modificata.
Val

Funziona alla grande se ho uno o più processi che eseguono quella corrispondenza ma ottengo un "top: Utente non valido" quando tutto si ferma. Si ripristina all'avvio di un altro processo. Sto correndo su Raspbian FYI. Grazie.
Mike,

1

che dire di questo?

top -c -p <PID>

4
stiamo cercando di filtrare in base al nome del processo (o alla sua sottostringa) e quando riavvii il processo otterrai un nuovo pid.
Srujan Kumar Gulla,

1

Ho finito per usare uno script di shell con il seguente codice:

#!/bin/bash

while [ 1 == 1 ]
do
    clear
    ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
    sleep 5
done

1

La maggior parte delle risposte fallisce qui, quando l'elenco dei processi supera i 20 processi. Questo è il top -plimite di opzioni. Per quelli con top più vecchi che non supportano il filtraggio con le oopzioni, ecco un esempio di script per ottenere un output a schermo intero / console (da questo output mancano informazioni di riepilogo).

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

Alcune spiegazioni

__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

In htop, puoi semplicemente cercare con

/process-name
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.