Quando è stato avviato un processo


31

Per sapere quando è stato avviato un processo, la mia prima ipotesi è stata quella di verificare l'ora in cui è /proc/<pid>/cmdlinestata scritta / modificata l'ultima volta.

psmostra anche un STARTcampo. Ho pensato che entrambe queste fonti sarebbero state le stesse. A volte non sono uguali. Come potrebbe essere?


Risposte:


44

Almeno su Linux puoi anche fare:

ps -o lstart= -p the-pid

per avere un orario di inizio più utile.

Si noti tuttavia che è l'ora in cui è stato avviato il processo , non necessariamente l'ora in cui è stato invocato il comando che sta eseguendo. I processi possono (e generalmente lo fanno) eseguire più di un comando nella loro vita. E i comandi a volte generano altri processi.

I mtime dei file /procsu Linux (almeno) sono generalmente la data in cui quei file sono stati istanziati, che sarebbe la prima volta che qualcosa tentasse di accedervi o elencare il contenuto della directory.

Per esempio:

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

L'espansione ha /proc/$$/xx*causato la lettura da parte della shell del contenuto di /proc/$$cui è cmdlinestata creata un'istanza del file.

Vedi anche: Timestamp del socket in / proc // fd


11

proc è un file system virtuale, quindi non farei affidamento su alcuna informazione sullo stato del file.

L'ora di inizio del processo si trova nella colonna / proc / PID / stat 22 . Viene dato in jiffies dopo l'avvio del sistema. Per convertirlo in secondi devi dividerlo per sysconf(_SC_CLK_TCK)100 per la maggior parte dei sistemi (ma non per tutti!).

Per ottenere il tempo di avvio del sistema, determinare il tempo di attività corrente in secondi, che è il primo valore di / proc / tempo di attività .

Avendo quei due numeri sottrai il primo dal secondo e ottieni il numero di secondi trascorsi dall'avvio del programma.

Esempio (per pidgin ):

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

Nota: questo semplice esempio non funziona se pidofrestituisce PID multipe.


Qualche idea su quando viene scritto proc / <pid> / cmdline? bene una qualsiasi delle voci proc / <pid> per quella materia.
Swair,

2
Di solito questi file vengono generati dal kernel in modo dinamico ogni volta che si tenta di leggerli e la maggior parte di essi ha anche un contenuto dinamico. cmdline no, ma non riesco a immaginare che esista una politica ufficiale che deve essere creata una volta all'avvio del processo e mai più toccata.
scai,

Puoi ottenere il valore _SC_CLK_TCK dalla riga di comando eseguendo "getconf CLK_TCK"
o
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.