it-swarm.com.de

Wie erhalte ich die Startzeit eines lang laufenden Linux-Prozesses?

Ist es möglich, die Startzeit eines alten laufenden Prozesses zu ermitteln? Es scheint, dass ps das Datum (nicht die Uhrzeit) angibt, wenn es heute nicht gestartet wurde, und nur das Jahr, wenn es dieses Jahr nicht gestartet wurde. Ist die Präzision für alte Prozesse für immer verloren?

219
ajwood

Sie können einen Formatierer angeben und lstart wie folgt verwenden:

ps -eo pid,lstart,cmd

Der obige Befehl gibt alle Prozesse mit Formatierern aus, um PID, Befehlsausführung und Datum + Uhrzeit des Starts abzurufen.

Beispiel (von der Debian/Jessie-Befehlszeile)

$ 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]                    
      ...

Sie können die Manpage von ps lesen oder überprüfen Sie die Seite von Opengroup für die anderen Formatierer.

339
wkl

Der Befehl ps (mindestens die von vielen Linux-Distributionen verwendete procps-Version) enthält eine Reihe von Formatfeldern, die sich auf die Startzeit des Prozesses beziehen, einschließlich lstart, das immer das vollständige Datum und die Uhrzeit des Starts des Prozesses angibt:

# 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

Eine Diskussion darüber, wie die Informationen im/proc-Dateisystem veröffentlicht werden, finden Sie unter https://unix.stackexchange.com/questions/7870/how-to-check-how-long-a-process-has- läuft

(Nach meiner Erfahrung unter Linux scheint der Zeitstempel in den Verzeichnissen/proc/auf einen Zeitpunkt bezogen zu sein, an dem vor kurzem auf das virtuelle Verzeichnis zugegriffen wurde, und nicht auf die Startzeit der Prozesse:

# 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

Beachten Sie, dass ich in diesem Fall gegen 16:50 Uhr einen "ps -p 1" -Befehl ausgeführt habe, dann eine neue Bash-Shell erstellt habe und kurz danach den "ps -p 1 -p $$" -Befehl in dieser Shell ausgeführt habe ... .)

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

Die PID von Google Chrome lautet beispielsweise 11583:

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

Als Folgemaßnahme zu Adam Matans Antwort ist der Zeitstempel des /proc/<pid> - Verzeichnisses als solcher nicht unbedingt direkt nützlich, aber Sie können ihn verwenden

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

um die Startzeit in Ticks seit dem Systemstart zu erhalten.1

Dies ist eine etwas knifflige Einheit. Siehe auch Konvertieren von Sekunden in Sekunden für Details.

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

Dies sollte Ihnen Sekunden geben, die Sie an strftime() übergeben können, um einen (von Menschen lesbaren oder anderweitig) Zeitstempel zu erhalten.

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

Aktualisiert mit einigen Korrekturen von Stephane Chazelas in den Kommentaren; danke wie immer!

Wenn Sie nur Mawk haben, versuchen Sie es vielleicht

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 ; Suche nach Startzeit .

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