it-swarm.it

Come verificare da quanto tempo è in esecuzione un processo?

Vorrei evitare di farlo avviando il processo da un'app di monitoraggio.

250
tshepang

Su Linux con ps da procps(-ng) (e la maggior parte degli altri sistemi poiché questo è specificato da POSIX):

ps -o etime= -p "$$" 

Dove $$ È il PID del processo che si desidera verificare. Ciò restituirà il tempo trascorso nel formato [[dd-]hh:]mm:ss.

L'uso di -o etime Indica a ps che vuoi solo il campo del tempo trascorso e che = Alla fine sopprime l'intestazione (senza, ottieni una riga che dice ELAPSED e poi l'ora sulla riga successiva; con, ottieni solo una riga con l'ora).

Oppure, con le versioni più recenti della suite di strumenti procps-ng (3.3.0 o successive) su Linux o su FreeBSD 9.0 o successive (e possibilmente altre), usare:

ps -o etimes= -p "$$"

(con l'aggiunta di s) per ottenere la formattazione del tempo come secondi, il che è più utile negli script.

Su Linux, il programma ps ottiene questo da /proc/$$/stat, Dove uno dei campi (vedi man proc) È l'ora di inizio del processo. Questo, sfortunatamente, è specificato per essere il tempo in jiffies (un contatore temporale arbitrario usato nel kernel Linux) dall'avvio del sistema. Quindi devi determinare il momento in cui il sistema si è avviato (da /proc/stat), Il numero di jiffie al secondo su questo sistema, quindi fare i calcoli per ottenere il tempo trascorso in un formato utile.

Risulta ridicolmente complicato trovare il valore di HZ (cioè jiffies al secondo). Dai commenti in sysinfo.c Nel pacchetto procps, si può A) includere il file di intestazione del kernel e ricompilare se si usa un kernel diverso, B) usare la funzione posix sysconf(), che, purtroppo, usa un valore hardcoded compilato nella libreria C, o C) chiedi al kernel, ma non esiste un'interfaccia ufficiale per farlo. Quindi, il codice ps include una serie di kludges con cui determina il valore corretto. Wow.

Quindi è conveniente che ps faccia tutto per te. :)

Come nota l'utente @ 336_, su Linux (non portatile), è possibile utilizzare il comando stat per esaminare le date di accesso, modifica o modifica dello stato per la directory /proc/$$ (Dove di nuovo $$ È il processo di interesse). Tutti e tre i numeri dovrebbero essere uguali, quindi

stat -c%X /proc/$$

ti darà il tempo in cui il processo $$ è iniziato, in secondi dall'Epoca. Non è ancora quello che vuoi, dal momento che devi ancora fare i conti con la matematica per sottrarlo dal tempo corrente per ottenere il tempo trascorso - suppongo che qualcosa come date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" funzionerebbe, ma è un po 'sgraziato. Un vantaggio possibile è che se si utilizza l'output di formato lungo come -c%x Invece di -c%X, Si ottiene una risoluzione maggiore di secondi di numero intero. Ma, se ne hai bisogno, probabilmente dovresti usare l'approccio di auditing dei processi perché i tempi di esecuzione del comando stat interferiranno con precisione.

324
mattdm

Portatile:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

vale a dire che Shell è stato avviato il 30 gennaio e ha totalizzato circa 6 secondi di tempo CPU.

Potrebbero esserci modi più precisi o più analizzabili ma meno portatili per ottenere queste informazioni. Controlla la documentazione del tuo comando ps o del tuo filesystem proc.

Sotto Linux, questa informazione vive in /proc/$pid/stat .

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

Il tempo della CPU è in jiffies; Non so con disinvoltura come trovare il valore Jiffy dalla Shell. L'ora di inizio è relativa all'ora di avvio (trovata in /proc/uptime).

ps -eo pid,comm,cmd,start,etime | grep -i X

X è il nome del processo

19
mezi

ps accetta un -o opzione per specificare il formato di output e una delle colonne disponibili è etime. Secondo la pagina man:

etime - tempo trascorso dall'inizio del processo, nella forma [[dd-] hh:] mm: ss.

Quindi puoi eseguirlo per ottenere il PID e il tempo trascorso di ogni processo:

$ ps -eo pid,etime

Se vuoi il tempo trascorso di un particolare PID (ad es. 12345), puoi fare qualcosa del tipo:

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

( Modifica : risulta che c'è una sintassi più breve per il comando sopra; vedi risposta di mattdm )

13
Michael Mrozek

Non sei sicuro del perché questo non sia stato ancora suggerito: su Linux puoi stat() la directory/proc/[nnn] per il tuo PID.

Questo comportamento è esplicitamente progettato per restituire l'ora di inizio del processo, cosa che può fare ad alta risoluzione e che il kernel può fare in modo accurato senza gli hack di jiffies poiché il kernel può (ovviamente) semplicemente controllare le informazioni rilevanti. I campi di accesso, modifica dei dati e modifica dello stato restituiscono l'ora di inizio del processo.

Soprattutto, è possibile utilizzare stat(1) su Shell o il binding appropriato a stat(2) da $ favorite_programming_language, quindi potrebbe non essere necessario avviare un processo esterno.

NOTE che questo non funziona con /usr/compat/linux/proc su FreeBSD; i tempi di accesso/modifica/cambio di stato restituiti sono l'ora corrente e l'ora di nascita è l'epoca UNIX. Abbastanza stupido il supporto non c'è se me lo chiedi.

5
i336_

Se puoi eseguire il tempo e poi eseguire un comando otterrai esattamente quello che stai cercando. Non puoi farlo contro un comando già in esecuzione.

[0]% tempo di sospensione 20

sleep 20 0.00s user 0.00s system 0% cpu 20.014 total

2
slashdot

$ ps -eo lstart ottieni ora di inizio

$ ps -eo etime ottieni durata/tempo trascorso

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819 è l'id del processo.

2
Terry wang

Tempo trascorso in secondi: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)

1
Shardj

puoi ottenere l'ora di inizio del processo guardando stat del file stat prodotto da proc, formattalo usando date e sottrandolo dall'ora corrente:

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

dove 13494 è il tuo processo 'pid

1
bobbins