Wann wurde ein Prozess gestartet?

31

Um zu wissen, wann ein Prozess gestartet wurde, war meine erste Vermutung, die Zeit zu überprüfen, zu der /proc/<pid>/cmdlinedas letzte Mal geschrieben / geändert wurde.

pszeigt auch ein STARTFeld. Ich dachte, diese beiden Quellen wären gleich. Manchmal sind sie nicht dasselbe. Wie kann das sein?

Swair
quelle

Antworten:

44

Zumindest unter Linux können Sie auch Folgendes tun:

ps -o lstart= -p the-pid

um eine nützlichere Startzeit zu haben.

Beachten Sie jedoch, dass dies der Zeitpunkt ist, zu dem der Prozess gestartet wurde, und nicht unbedingt der Zeitpunkt, zu dem der Befehl , den er gerade ausführt, aufgerufen wurde. Prozesse können (und tun dies im Allgemeinen) mehr als einen Befehl in ihrer Lebensdauer ausführen. Und Befehle erzeugen manchmal andere Prozesse.

Die mtimes der Dateien in /procLinux (zumindest) sind im Allgemeinen das Datum, an dem diese Dateien instanziiert wurden. Dies ist das erste Mal, dass versucht wird, auf sie zuzugreifen oder den Verzeichnisinhalt aufzulisten.

Zum Beispiel:

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

Durch das Erweitern wurde /proc/$$/xx*die Shell zum Lesen des Inhalts /proc/$$veranlasst, durch den die cmdlineDatei instanziiert wurde.

Siehe auch: Zeitstempel des Sockets in / proc // fd

Stéphane Chazelas
quelle
11

proc ist ein virtuelles Dateisystem, daher würde ich mich nicht auf Dateistatusinformationen verlassen.

Die Startzeit des Prozesses befindet sich in Spalte 22 / proc / PID / stat . Es ist in Sekundenschnelle nach dem Systemstart gegeben. Um wandeln es in Sekunden müssen Sie es durch dividieren denen 100 für die meisten Systeme (aber nicht alle!).sysconf(_SC_CLK_TCK)

Um die Zeit des Systemstarts zu ermitteln, bestimmen Sie die aktuelle Betriebszeit in Sekunden. Dies ist der erste Wert von / proc / uptime .

Mit diesen beiden Zahlen subtrahieren Sie die erste von der zweiten und Sie erhalten die Anzahl der Sekunden, die seit dem Start des Programms vergangen sind.

Beispiel (für Pidgin ):

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

Hinweis: Dieses einfache Beispiel funktioniert nicht, wenn pidofmehrere PIDs zurückgegeben werden.

scai
quelle
Irgendeine Idee, wann proc / <pid> / cmdline geschrieben wird? Nun, jeder von proc / <pid> Einträgen für diese Angelegenheit.
Swair
2
Normalerweise werden diese Dateien vom Kernel dynamisch generiert , wenn Sie versuchen, sie zu lesen, und die meisten von ihnen haben auch einen dynamischen Inhalt. cmdline tut dies nicht, aber ich kann mir nicht vorstellen, dass es eine offizielle Richtlinie gibt, die einmal beim Start des Prozesses erstellt und nie wieder berührt werden muss.
Scai
Sie können den _SC_CLK_TCK-Wert über die Befehlszeile abrufen, indem Sie "getconf CLK_TCK"
22.