Filtraggio dell'output del comando superiore


12

Sto eseguendo un Mac e voglio filtrare l'output del topcomando per un processo particolare in modo che vengano visualizzate solo le colonne PID, COMMAND e% CPU.

Dopo aver ottenuto il PID del processo, eseguo:

top -pid 1234

Tuttavia, questo visualizza più di 15 colonne per quel processo. Posso reindirizzare l'output del comando in awk e visualizzare solo:

PID COMMAND %CPU

colonne?

Non voglio archiviare l'output in un file di testo e quindi elaborarlo. Sono interessato a monitorare il processo in tempo reale.

Risposte:


8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: il tuo ID processo
  • -stats pid,command,cpu: mostra solo ID processo, nome e% CPU

Non è necessario eseguire awkl'output.


Se si desidera postelaborare l'output, utilizzare -l 0per eseguire in modalità di registrazione (0 significa indefinitamente, tutto il resto limita il numero di campioni). L'output sarà simile al seguente (due ripetizioni):

Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09 
CPU usage: 20.0% user, 26.66% sys, 53.33% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 0.0 
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09 
CPU usage: 0.95% user, 1.90% sys, 97.14% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 2.7 

Utilizzare awko uno strumento simile per visualizzare solo ogni 13a riga (poiché queste righe contengono i valori in quell'esempio):

$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907  WindowServer 0.0 
3907  WindowServer 1.3 
3907  WindowServer 2.2 

# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg

@AstraSerg Funziona per me. Si noti che questa è una domanda Mac OS, che ha una diversa topda Linux.
Daniel Beck

6

Questo certamente può essere fatto e ho intenzione di spiegare come lo farei. Non sto fingendo che questo sia un approccio ottimale, ma fa il lavoro. Sto usando Linux (e bash shell), quindi il comportamento predefinito del mio top potrebbe essere leggermente diverso. Quindi potrebbe essere necessario ottimizzare questo mini-howto per il tuo scenario particolare.

  1. Esegui il top , senza alcun argomento:

    $ top

    Ecco l'intestazione e una riga pertinente dal mio output:

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java

    Ho raccolto un processo che rimane in memoria per un po 'di tempo e consuma effettivamente la CPU, lo userò come processo di test per raggiungere l'obiettivo finale.

  2. Per impostazione predefinita, top funziona in modalità interattiva. Questo non mi va bene, voglio acquisire i dati rilevanti e stamparli. In seguito gestirò il compito di visualizzare i dati in modo interattivo. Citazioni rilevanti dalla manpage superiore:

    -b: operazione in modalità batch Avvia in alto in "Modalità batch", che potrebbe essere utile per inviare l'output dall'alto ad altri programmi o ad un file. In questa modalità, top non accetterà l'input e verrà eseguito fino al limite di iterazioni impostato con l'opzione della riga di comando '-n' o fino a quando non viene ucciso.

    -n: numero di iterazioni limite come: -n numero Specifica il numero massimo di iterazioni, o frame, che top dovrebbe produrre prima di terminare.

    Questo è il comando superiore corretto che stampa l'output solo una volta, quindi esce:

    $ top -b -n 1

  3. Conosco il PID che voglio guardare, quindi aggiungerò un'altra limitazione all'inizio, quindi stampa i dati solo su quel processo:

    $ top -b -n 1 -p 2569

  4. Anche in modalità batch, top stampa comunque un'intestazione, contenente varie statistiche a livello di sistema come uptime, memoria libera / swap ecc. Non mi serve. Tutto ciò di cui ho bisogno è solo una riga, quella che contiene i dati sul mio processo, quindi li taglierò dall'intero output in questo modo:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1

    Come puoi vedere, ho la seconda riga da 1.

  5. Invierò questa riga su awk per estrarre solo le colonne di cui ho bisogno:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  6. Fino ad ora, ho fatto queste manipolazioni nella riga di comando, ora è il momento di aggiungere persistenza e flessibilità al nostro caso particolare codificato. Sto spostando l'intera riga in un semplice script shell. Lo chiamerò 3top , il nome è sottolineato perché verrà utilizzato in seguito:

    #!/bin/bash

    top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  7. Il numero PID è hardcoded, ecco come fare in modo che lo script lo accetti come argomento della riga di comando:

    #!/bin/bash

    top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

    Per rendere le statistiche di visualizzazione 3top su PID 2569, deve essere chiamato in questo modo:

    $ ./3top 2569

  8. Voglio anche la percentuale visualizzata dopo il caricamento della CPU, quindi sto sintonizzando il mio script 3top in questo modo:

    #!/bin/bash

    out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')

    echo "$out%"

    Ho reindirizzato l'intero output di una catena di comandi (collegati tramite pipe) in una variabile. Quindi lo stampo semplicemente usando echo e aggiungo un '%' alla fine, poiché il carico della CPU è l'ultimo campo

  9. A questo punto ho uno script batch che accetta un PID come argomento e stampa le statistiche una volta. Desideri invece il monitoraggio in tempo reale? È facile, perché l' orologio può farlo! Esegui lo script in questo modo:

    $ watch -n 1 3top 2569

    Farà il monitoraggio in tempo reale eseguendo 3top una volta al secondo.


11
L'utente è su OS X e non ha Gnu top. opzione o sintassi non valida: -b . Non ho idea del perché questo sia stato ripetutamente votato.
Daniel Beck

5
Gnu top(a procps) non può essere installato utilizzando Homebrew, MacPorts o Fink e non può essere compilato da sorgente utilizzando makeo cc top.c.
Daniel Beck

2

Il topformato di visualizzazione è personalizzabile, ma non esiste un modo per specificare le opzioni di visualizzazione nella riga di comando. Se sei inventivo, tuttavia, puoi probabilmente fare ciò di cui hai bisogno manipolando abilmente il ~/.toprcfile.

Supponendo che non hai già personalizzato la visualizzazione di top(e non hai un ~/.toprcfile):

  1. Avvia top.
  2. Premere fper accedere alla modalità di selezione campo.
  3. Per ogni campo che ha *accanto un campo che non desideri, premi la lettera corrispondente per deselezionare quel campo. Ad esempio, premere eper deselezionare il User Namecampo. Quando hai finito, si dovrebbe avere solo *accanto Process Id, CPU usagee Command name/line.
  4. Premere Spaceper tornare alla finestra principale.
  5. Premere W(ovvero Shift+ w) per salvare il layout corrente nel ~/.toprcfile.
  6. Esci top, quindi riavvia per verificare che le impostazioni siano state salvate.
  7. Quando si desidera tornare al layout predefinito, rinominare ~/.toprcqualcosa di simile ~/min.toprcprima del lancio top. Quando si desidera passare al layout minimo, rinominare ~/min.toprcnuovamente ~/.toprcprima del lancio top.

Questo rinominare e lanciare file toppuò probabilmente essere trasformato in un semplice script di shell da qualcuno con un'oncia più esperienza e conoscenza di me. Sarà necessario prestare particolare attenzione se il toplayout normale è già stato personalizzato.


È possibile aggiungere un filtro (anche se manualmente) a .toprc? Mi piace aggiungere il filtro RUID>999all'avvio.
Dr Beco,
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.