Come ottenere l'ora di inizio di un processo Linux di lunga durata? [chiuso]


250

È possibile ottenere l'ora di inizio di un vecchio processo in esecuzione? Sembra che psriporterà la data (non l'ora) se non è stata avviata oggi, e solo l'anno se non è stata avviata quest'anno. La precisione è persa per sempre per i vecchi processi?


16
C'è qualcosa di sbagliato nell'uso ps -p <pid> -o lstart? Sembra che funzioni, ma non sono sicuro del perché non sia la risposta ovvia immediata per le molte volte che questa domanda sembra sorgere.
Ajwood,

7
@ajwood Sarebbe meglio usare ps -p <pid> -o lstart=per evitare di stampare una riga aggiuntiva (intestazione).
Vladimir Protasov,

2
C'è qualcosa di sbagliato nell'uso ps -p <pid> -o lstart? Forse il fatto non esiste lstartné nell'edizione 2004 né nell'edizione 2013 dello standard POSIX 1003.1?
Piotr Dobrogost,

5
@PiotrDobrogost, sarebbe un problema se la domanda fosse posta su POSIX, ma si tratta di Linux.
Womble

4
Mod - techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - perché non lo sposti in un sito più appropriato come StackExchange o Superuser invece di chiudere la domanda? Questa è una domanda utile e utile
Hanxue,

Risposte:


392

È possibile specificare un formattatore e utilizzare lstart, come questo comando:

ps -eo pid,lstart,cmd

Il comando sopra genererà tutti i processi, con i formattatori per ottenere PID, esecuzione del comando e data + ora di avvio.

Esempio (dalla riga di comando Debian / Jessie)

$ ps -eo pid,lstart,cmd
  PID CMD                                          STARTED
    1 Tue Jun  7 01:29:38 2016 /sbin/init                  
    2 Tue Jun  7 01:29:38 2016 [kthreadd]                  
    3 Tue Jun  7 01:29:38 2016 [ksoftirqd/0]               
    5 Tue Jun  7 01:29:38 2016 [kworker/0:0H]              
    7 Tue Jun  7 01:29:38 2016 [rcu_sched]                 
    8 Tue Jun  7 01:29:38 2016 [rcu_bh]                    
    9 Tue Jun  7 01:29:38 2016 [migration/0]               
   10 Tue Jun  7 01:29:38 2016 [kdevtmpfs]                 
   11 Tue Jun  7 01:29:38 2016 [netns]                     
  277 Tue Jun  7 01:29:38 2016 [writeback]                 
  279 Tue Jun  7 01:29:38 2016 [crypto]                    
      ...

Puoi leggere psla manpage o controllare la pagina di Opengroup per gli altri formattatori.


3
@ bobbyrne01: cambia l'ordine, ad esempio pid, etime, cmd funziona per me su Debian Wheezy.
exic

1
@Gobliins: etimeè il tempo trascorso dall'inizio del processo.
wkl,

4
per completezza, per quelli abituati alla sintassi di BSD: ps axo pid,cmd,lstartfunziona anche
Graeme Moss,

2
@ bobbyme01: usa l'opzione -ww
Ed Randall il

1
Ricorda che il lstarttempo può cambiare, i statmetodi seguenti sono più sicuri: unix.stackexchange.com/questions/274610/… .
slm,

43

Il comando ps (almeno la versione procps utilizzata da molte distribuzioni Linux) ha un numero di campi di formato che si riferiscono all'ora di inizio del processo, incluso il lstartquale fornisce sempre la data e l'ora complete di inizio del processo:

# ps -p 1 -wo pid,lstart,cmd
  PID                  STARTED CMD
    1 Mon Dec 23 00:31:43 2013 /sbin/init

# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER       PID %CPU %MEM    VSZ   RSS TT       STAT                  STARTED CMD
root         1  0.0  0.1   2800  1152 ?        Ss   Mon Dec 23 00:31:44 2013 /sbin/init
root      5151  0.3  0.1   4732  1980 pts/2    S    Sat Mar  8 16:50:47 2014 bash

Per una discussione su come le informazioni sono pubblicate nel filesystem / proc, vedere /unix/7870/how-to-check-how-long-a-process-has-been-running

(Nella mia esperienza con Linux, il timestamp nelle directory / proc / sembra essere correlato a un momento in cui la directory virtuale è stata recentemente aperta anziché l'ora di inizio dei processi:

# date; ls -ld /proc/1 /proc/$$ 
Sat Mar  8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151

Si noti che in questo caso ho eseguito un comando "ps -p 1" verso le 16:50, quindi ho generato una nuova shell bash, quindi ho eseguito il comando "ps -p 1 -p $$" all'interno di quella shell poco dopo ... .)


Per vedere ogni processo (non solo il tuo) aggiungere un argomento e( pssintassi standard ) o ax(sintassi BSD) al comando ps: ovvero ps -ewo pid,lstart,cmdops -axwo pid,lstart,cmd
Ryan Griffith

15

A seguito della risposta di Adam Matan , il /proc/<pid>timestamp della directory in quanto tale non è necessariamente direttamente utile, ma è possibile utilizzare

awk -v RS=')' 'END{print $20}' /proc/12345/stat

per ottenere l'ora di inizio in tick di clock dall'avvio del sistema. 1

Questa è un'unità leggermente complicata da usare; vedi anche convertire i jiffies in secondi per i dettagli.

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { printf "%9.0f\n", now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat

Questo dovrebbe darti secondi, a cui puoi passare strftime()per ottenere un timestamp (leggibile dall'uomo o altrimenti).

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat

Aggiornato con alcune correzioni di Stephane Chazelas nei commenti; grazie come sempre!

Se hai solo Mawk, forse prova

awk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
  NR==1 { now=$1; next }
  END { printf "%9.0f\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 uomo proc ; cerca l' inizio .


Leggermente refactored per l'uso in produzione: gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee

1
Tieni presente che strftime()e systime()non sono presenti mawk, che è l'impostazione predefinita awknelle mie immagini VPS Debian 8, quindi posso solo supporre che siano specifiche gawkdel dialetto di.
ssokolow,

13
ls -ltrh /proc | grep YOUR-PID-HERE

Ad esempio, il mio PID di Google Chrome è 11583:

ls -l /proc | grep 11583
dr-xr-xr-x  7 adam       adam                     0 2011-04-20 16:34 11583

6
Questo non funziona per me - stampa il tempo di modifica (cambia frequentemente) Forse per questo motivo
user920391

Il timestamp di / proc / <pid> non è affidabile.
Henning,

1
Ciò è ritornato 9 minuti dopo rispetto a quando era effettivamente iniziato un processo di cui ho informazioni.
Dan Dascalescu il

1
Questa sembra essere la mia unica opzione che funziona, anche se forse non è affidabile. Sono su un sistema incorporato che ha solobox occupato psche dice invalid optionper tutte le opzioni menzionate da altre risposte.
Qi Fan,

7
Perché grep? Perché no ls -ldh /proc/$pid? O ancora meglio date -r /proc/$pid?
Cesare,


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.