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

250

Ist es möglich, die Startzeit eines alten laufenden Prozesses abzurufen? Es scheint, dass psdas Datum (nicht die Uhrzeit) gemeldet wird, 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?

Ajwood
quelle
16
Ist etwas falsch an der Verwendung ps -p <pid> -o lstart? Scheint so, als ob es funktioniert, aber ich bin mir nicht sicher, warum es nicht die unmittelbare offensichtliche Antwort für die vielen Male ist, in denen diese Frage auftaucht.
Ajwood
7
@ajwood Es ist besser zu verwenden ps -p <pid> -o lstart=, um zu vermeiden, dass zusätzliche Zeilen (Überschriften) gedruckt werden.
Vladimir Protasov
2
Ist etwas falsch an der Verwendung ps -p <pid> -o lstart? Vielleicht die Tatsache, dass es lstartweder in der Ausgabe 2004 noch in der Ausgabe 2013 des POSIX 1003.1-Standards gibt?
Piotr Dobrogost
5
@PiotrDobrogost, das wäre ein Problem, wenn die Frage nach POSIX gestellt würde, aber nach Linux.
womble
4
Mods - Techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - warum verschieben Sie sie nicht auf eine geeignetere Site wie StackExchange oder Superuser, anstatt die Frage zu schließen? Dies ist eine gute und nützliche Frage
Hanxue

Antworten:

392

Sie können einen Formatierer angeben und lstartwie folgt verwenden:

ps -eo pid,lstart,cmd

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

Beispiel (über die 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 psManpage lesen oder auf der Opengroup-Seite nach den anderen Formatierern suchen .

wkl
quelle
3
@ bobbyrne01: ändere die Reihenfolge, zB pid, etime, cmd funktioniert für mich auf Debian Wheezy.
Exic
1
@Gobliins - etimeist die Zeit, die seit dem Start des Prozesses vergangen ist.
wkl
4
der Vollständigkeit halber für diejenigen, die an BSD-Syntax gewöhnt sind: ps axo pid,cmd,lstartfunktioniert auch
Graeme Moss
2
@ Bobbyme01: Verwenden Sie die Option -ww
Ed Randall
1
Beachten Sie, dass sich die lstartZeit ändern kann. Die folgenden statMethoden sind sicherer - unix.stackexchange.com/questions/274610/… .
Slm
43

Der Befehl ps (zumindest die von vielen Linux-Distributionen verwendete procps-Version) enthält eine Reihe von Formatfeldern, die sich auf die Prozessstartzeit beziehen, einschließlich lstartder Angaben zum vollständigen Datum und zur Uhrzeit des Starts des Prozesses:

# 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 Dateisystem / proc veröffentlicht werden, finden Sie unter /unix/7870/how-to-check-how-long-a-process-has-been-running

(Nach meiner Erfahrung unter Linux scheint sich der Zeitstempel in den Verzeichnissen / proc / auf einen Moment zu beziehen, in dem kürzlich 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 Befehl "ps -p 1" ausführte, dann eine neue Bash-Shell erzeugte und kurz darauf den Befehl "ps -p 1 -p $$" in dieser Shell ausführte ... .)

Nathan
quelle
Um jeden Prozess (nicht nur Ihren eigenen) zu sehen, fügen Sie dem Befehl ps ein Argument e(Standardsyntax ps) oder ax(BSD-Syntax) hinzu: dh ps -ewo pid,lstart,cmdoderps -axwo pid,lstart,cmd
Ryan Griffith
15

Als Folge der Antwort von Adam Matan ist der /proc/<pid>Zeitstempel des 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 Uhrzecken seit dem Systemstart zu erhalten. 1

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

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

Dies sollte Ihnen Sekunden geben, an die Sie übergeben können strftime(), um einen (für Menschen lesbaren oder anderweitig lesbaren) 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\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 Mann proc ; Suche nach Startzeit .

Tripleee
quelle
Für den Produktionseinsatz leicht
überarbeitet
1
Denken Sie daran, dass die strftime()und systime()nicht vorhanden mawksind. Dies ist die Standardeinstellung awkin meinen Debian 8 VPS-Bildern. Daher kann ich nur davon ausgehen, dass sie spezifisch für gawkden Dialekt sind.
ssokolow
13
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
Adam Matan
quelle
6
Dies funktioniert nicht für mich - es druckt Änderungszeit (ändert sich häufig) Vielleicht aus diesem Grund: unix.stackexchange.com/questions/20460/…
user920391
Der Zeitstempel von / proc / <pid> ist nicht zuverlässig.
Henning
1
Dies kehrte 9 Minuten später zurück, als tatsächlich ein Prozess gestartet wurde, über den ich Informationen habe.
Dan Dascalescu
1
Dies scheint meine einzige Option zu sein, die funktioniert, obwohl sie möglicherweise nicht zuverlässig ist. Ich bin auf einem eingebetteten System, das nur eine Busybox hat, psdie invalid optionalle in anderen Antworten genannten Optionen angibt .
Qi Fan
7
Warum grep? Warum nicht ls -ldh /proc/$pid? Oder noch besser date -r /proc/$pid?
Caesar
6
 ps -eo pid,etime,cmd|sort -n -k2
Bash-O-Logist
quelle
6
    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
Paketüberfluss
quelle
1
Dies wird auch einen eigenen Prozess beinhalten
Paul Verschoor