web-dev-qa-db-fra.com

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 indique la date (et non l'heure) si elle n'a pas été commencée aujourd'hui, et uniquement l'année si elle n'a pas été commencée cette année. La précision est-elle perdue à jamais pour les anciens processus?

219
ajwood

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 des formateurs pour obtenir le PID, l'exécution de la commande et la date et l'heure démarrées.

Exemple (à partir de 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 consultez la page d'Opengroup pour les autres formateurs.

339
wkl

La commande ps (au moins la version de procps utilisée par de nombreuses distributions Linux) contient un certain nombre de champs de format liés à l'heure de début du processus, notamment lstart, qui indique toujours la date et l'heure complètes du démarrage 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 manière 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- été en cours d'exécution

(D'après mon expérience sous Linux, l'horodatage sur les répertoires/proc/semble être lié à un moment d'accès récent au répertoire virtuel 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" vers 16h50, puis créé un nouveau shell bash, puis la commande "ps -p 1 -p $$" dans ce shell peu de temps après ... .)

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

Par exemple, le PID de mon Google Chrome est 11583:

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

Pour faire suite à réponse d'Adam Matan , l'horodatage du répertoire /proc/<pid> en 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 ticks d'horloge depuis le démarrage du système.1

Ceci est une unité légèrement délicate à utiliser; voir aussi convertir 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 autrement).

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 des corrections de Stéphane Chazelas dans les commentaires; merci comme toujours!

Si vous n’avez que Mawk, essayez peut-être

awk -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 man proc ; recherchez heure de début .

13
tripleee
 ps -eo pid,etime,cmd|sort -n -k2
6
bash-o-logist
    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
4
Stackoverflow