Comment obtenir l’heure de démarrage d’un processus Linux de longue durée?

Est-il possible d’obtenir l’heure de début d’un ancien processus en cours d’exécution? Il semble que ps signalera la date (pas l’heure) si elle n’a pas été démarrée aujourd’hui, et seulement l’année si elle n’a pas été lancée cette année. La précision est-elle perdue pour toujours pour les anciens processus?

Vous pouvez spécifier un formateur et utiliser lstart , comme cette commande:

 ps -eo pid,lstart,cmd 

La commande ci-dessus affichera tous les processus, avec les formateurs pour obtenir le PID, l’exécution de la commande et la date et l’heure de début.

Exemple (depuis la ligne de commande 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] ... 

Vous pouvez lire la page de manuel de ps ou consulter la page Opengroup pour les autres formateurs.

La commande ps (au moins la version procps utilisée par de nombreuses dissortingbutions Linux) comporte un certain nombre de champs de format liés à l’heure de début du processus, y compris lstart qui lstart toujours la date et l’heure complètes du processus:

 # 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 

Pour une discussion sur la façon dont les informations sont publiées dans le système de fichiers / proc, voir https://unix.stackexchange.com/questions/7870/how-to-check-how-long-a-process-has-been-running

(Dans mon expérience sous Linux, l’horodatage sur les répertoires / proc / semble être lié à un moment auquel le répertoire virtuel a été récemment accédé plutôt qu’à l’heure de début des processus:

 # 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 

Notez que dans ce cas, j’ai exécuté une commande “ps -p 1” à environ 16h50, puis généré un nouveau shell bash, puis exécuté la commande “ps -p 1 -p $$” dans ce shell peu de temps après … .)

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

Par exemple, le PID de Google Chrome est 11583:

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

Comme suite à la réponse d’Adam Matan , l’horodatage du /proc/ tant que tel n’est pas nécessairement directement utile, mais vous pouvez utiliser

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

pour obtenir l’heure de début en heures depuis le démarrage du système. 1

C’est une unité légèrement délicate à utiliser; voir aussi convertir les jiffies en secondes pour plus de détails.

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

Cela devrait vous donner des secondes, que vous pouvez passer à strftime() pour obtenir un horodatage (lisible par l’homme ou autre).

 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 

Mis à jour avec quelques corrections de Stéphane Chazelas dans les commentaires; merci comme toujours!

Si vous avez seulement Mawk, essayez peut-être

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

1 homme proc ; rechercher l’ heure de début

  ps -eo pid,etime,cmd|sort -n -k2 
  ps -eo pid,cmd,lstart | grep YOUR-PID-HERE