Formatta l'output di cputime per ps


13

Sto cercando di scrivere uno script in grado di monitorare l'utilizzo della CPU di un processo su un intervallo (per creare un grafico).

Finora, questo è il comando che sto usando

ps -p $PROCID -o cputime,etimes

La mia unica preoccupazione è che l'output di cputime sembra essere [dd]hh:mm(o qualcosa di simile, non riesco a ricordare dalla cima della mia testa ora)

C'è un modo per formattare cputime in secondi, un po 'come etime -> etimes per ottenere il tempo trascorso in secondi?

Modifica: questo è l'output che sto attualmente ricevendo

2-03:01:33 2653793

Vorrei che il primo parametro fosse formattato in secondi, non giorni-ore: minuti: secondi.


puoi aggiungere l'output che ricevi ora e l'output che desideri ricevere?
Simply_Me

@Simply_Me Ho modificato il post
dreadiscool il

@ John1024 Sì, lo è, è la quantità di giorni.
dreadiscool,

Risposte:


9

Questo converte la prima volta in secondi:

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'

Ad esempio, il comando ps produce:

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931

Il awkcomando elabora e restituisce:

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931

Spiegazione

  • -F'[: ]+'

    Questo dice a awk di trattare sia i due punti sia gli spazi come separatori di campo. In questo modo, le ore, i minuti e i secondi vengono visualizzati come campi separati.

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

    L'iniziale /:/limita il funzionamento del codice solo su linee che includono due punti. Ciò rimuove le righe di intestazione. Il numero di secondi viene calcolato da ore, minuti, secondi tramite t=$3+60*($2+60*$1). Il valore risultante per tviene quindi stampato lungo il lato con il tempo trascorso.

Giorni di trattamento

Se psproduce giorni, ore, minuti, secondi, come in:

2-03:01:33

Quindi utilizzare questo codice invece:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'

Se i giorni possono o meno essere anteposti all'output, utilizzare questo comando combinato:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'

Perdonami se sbaglio, ma non sembra che questo comando stia prendendo in considerazione i giorni, che possono anche essere anteposti
dreadiscool,

È corretto: il mio sistema non ha mostrato giorni per nessun processo. Posso immaginare quali potrebbero essere i giorni, ma puoi fornire un esempio reale?
Giovanni 1024

2-03: 01: 33 è 2 giorni, 3 ore, 1 minuto e 33 secondi. Tuttavia, i giorni non vengono sempre anteposti. Sul mio sistema è anteposto solo se il processo è attivo da più di 24 ore. Grazie per il tuo aiuto finora, lo apprezzo molto
dreadiscool,

@ user1772510 Risposta aggiornata per gestire i giorni.
Giovanni 1024,

Grazie per tutto il vostro aiuto, se potessi votare anche io voterei (non abbastanza rappresentante in questa comunità) lo apprezzo profondamente!
dreadiscool,

2

Se non vuoi portare awk nel gioco, una soluzione bash pura (t_str contiene la stringa formattata, t_sec il tempo decodificato in secondi):

# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
  t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
  t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi

0

Non specifichi per quale sistema operativo questo sia; se si tratta di Linux e dato che sei interessato a monitorare un processo specifico, potresti trovare più utile analizzare /proc/$PROCID/stat- vedi la proc(5)pagina di manuale per i dettagli.

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.