Comment obtenir l'heure de début d'un processus Linux de longue durée? [fermé]

250

Est-il possible d'obtenir l'heure de début d'un ancien processus en cours d'exécution? Il semble que psla date (et non l'heure) sera signalée si elle n'a pas commencé aujourd'hui, et seulement l'année si elle n'a pas commencé cette année. La précision est-elle perdue à jamais pour les anciens processus?

ajwood
la source
16
Y a-t-il un problème avec l'utilisation ps -p <pid> -o lstart? Il semble que cela fonctionne, mais je ne sais pas pourquoi ce n'est pas la réponse évidente immédiate pour les nombreuses fois où cette question semble se poser.
ajwood
7
@ajwood Il serait préférable d'utiliser ps -p <pid> -o lstart=pour éviter d'imprimer une ligne supplémentaire (en-tête).
Vladimir Protasov le
2
Y a-t-il un problème avec l'utilisation ps -p <pid> -o lstart? Peut-être le fait qu'il n'y a lstartni dans l' édition 2004 ni dans l' édition 2013 de la norme POSIX 1003.1?
Piotr Dobrogost
5
@PiotrDobrogost, ce serait un problème si la question posait sur POSIX, mais c'est sur Linux.
womble
4
Mods - techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - pourquoi ne pas le déplacer vers un site plus approprié tel que StackExchange ou Superuser au lieu de fermer la question? C'est une bonne et utile question
Hanxue

Réponses:

392

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 + heure démarrée.

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 psla page de manuel de ou consulter la page d' Opengroup pour les autres formateurs.

wkl
la source
3
@ bobbyrne01: changez l'ordre, par exemple pid, etime, cmd fonctionne pour moi sur Debian Wheezy.
exique
1
@Gobliins - etimeest le temps écoulé depuis le démarrage du processus.
wkl
4
pour l'exhaustivité, pour ceux habitués à la syntaxe BSD: ps axo pid,cmd,lstartfonctionne également
Graeme Moss
2
@ bobbyme01: utilisez l'option -ww
Ed Randall
1
Sachez que le lstarttemps peut changer, les statméthodes ci-dessous sont plus sûres - unix.stackexchange.com/questions/274610/… .
slm
43

La commande ps (au moins la version procps utilisée par de nombreuses distributions Linux) a un certain nombre de champs de format qui se rapportent à l'heure de début du processus, y compris lstartqui donne toujours la date et l'heure complètes de 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 façon dont les informations sont publiées dans le système de fichiers / proc, voir /unix/7870/how-to-check-how-long-a-process-has-been-running

(D'après mon expérience sous Linux, l'horodatage sur les répertoires / proc / semble être lié à un moment où 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" vers 16h50, puis j'ai généré un nouveau shell bash, puis j'ai exécuté la commande "ps -p 1 -p $$" dans ce shell peu de temps après ... .)

Nathan
la source
Pour voir chaque processus (pas seulement le vôtre), ajoutez un argument e( pssyntaxe standard ) ou ax(syntaxe BSD) à la commande ps: ie ps -ewo pid,lstart,cmdoups -axwo pid,lstart,cmd
Ryan Griffith
15

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

Il s'agit d'une unité légèrement délicate à utiliser; voir aussi convertir des jiffies en secondes pour plus de détails.

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

Cela devrait vous donner des secondes, que vous pouvez passer pour strftime()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 correctifs 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\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 homme proc ; recherchez starttime .

tripleee
la source
Légèrement refactorisé pour une utilisation en production: gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee
1
Gardez à l'esprit que le strftime()et systime()ne sont pas présents dans mawk, ce qui est la valeur awkpar défaut dans mes images Debian 8 VPS, donc je peux seulement supposer qu'ils sont spécifiques au gawkdialecte de.
ssokolow
13
ls -ltrh /proc | grep YOUR-PID-HERE

Par exemple, mon 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
Adam Matan
la source
6
Cela ne fonctionne pas pour moi - il imprime l'heure de modification (change fréquemment) Peut-être à cause de cela: unix.stackexchange.com/questions/20460/…
user920391
L'horodatage de / proc / <pid> n'est pas fiable.
Henning le
1
Cela est revenu 9 minutes plus tard que lorsqu'un processus sur lequel j'avais des informations avait réellement commencé.
Dan Dascalescu
1
Cela semble être ma seule option qui fonctionne, mais peut-être pas fiable. Je suis sur un système embarqué qui n'a que busybox psqui dit invalid optionpour toutes les options mentionnées par d'autres réponses.
Qi Fan
7
Pourquoi grep? Pourquoi ne pas ls -ldh /proc/$pid? Ou encore mieux date -r /proc/$pid,?
César
6
 ps -eo pid,etime,cmd|sort -n -k2
bash-o-logist
la source
6
    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
Stackoverflow
la source
1
Cela comprendra également son propre processus
Paul Verschoor