Come fare in modo che il comando ps mostri memoria in mb anziché in kb?


11

Il comando ps di Linux mostra diversi usi di memoria come rss, dimensione in kb di default. C'è un modo per mostrare in mb o gb come ls -s --human-readablefa?


1
La mancanza di menzione in man psmi suggerisce che non esiste tale opzione integrata.
Ulrich Schwarz,

Risposte:


20

AFAIK non puoi raggiungerlo semplicemente con un puro pscomando con opzioni. Tuttavia puoi usare alcuni processori di testo come awke farlo per fare quello che vuoi:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'

Questo prende il risultato da pse poi per ogni riga tranne la prima che sostituisce la quinta colonna che è normalmente in KB, a MB aggiungendo il suffisso M.

Puoi renderlo un alias e memorizzarlo nel file .bashrc in modo da poterlo chiamare con qualcosa del genere myps.

Molte persone chiedono come conservare il formato o usare altre unità e precisione.

Per la versione semplice è possibile utilizzare il column -tfiltro di output:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t

Questo tuttavia non riconosce correttamente gli spazi nell'ultima colonna. Purtroppo dobbiamo occuparci della formattazione del testo e preparare la nostra stringa di formato in un printfformato simile.

ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'

Spiegazione:

  • NR==1la condizione è solo per la prima riga (intestazione). Stiamo utilizzando l'output ps originale per determinare dove inizia COMMAND:
    • o=$0 memorizza l'intera riga non modificata in modo da poterla utilizzare in seguito
    • a=match($0,$11) trova la posizione dell'11 ° campo (che dovrebbe essere dove la colonna COMMAND sta iniziando nell'output originale)
  • NR>1è per le seguenti righe (dati). Stiamo cambiando il 5 ° campo:
    • $5=int(10*$5/1024)/10"M" cambia il valore in Megabyte con un decimale e aggiunge il suffisso "M".
    • printf mostra tutti i campi in stile colonna:
      • %-10ssignifica sper stringa, 10per 10 caratteri di larghezza, -per allineare a sinistra
      • %8ssignifica sper stringa, 8per 8 caratteri di larghezza, e poiché non viene -prodotto alcun output di questo campo è allineato a destra.
    • substr(o, a)prende la sottostringa della linea originale (quindi omemorizzata in precedenza) a partire dalla posizione acalcolata nella condizione precedente, in modo da poter visualizzare l'output del comando con spazi conservati.

3
Modificato per GB e con 2 cifre decimali (ad es. 1.23GB):ps aux | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{ print;}'
mahemoff

1
è possibile raggiungere lo stesso obiettivo preservando la psformattazione? Le schede sono completamente rimosse conawk
Chris

Vedo che stai lanciando un int, è possibile averlo decimale come 1,2 M?
JavaSheriff il

Perché mancano le schede?
Alex78191,

@ Alex78191: aggiunto un comando alternativo per la formattazione con output simile a una tabella
DevilaN
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.