
Wie finde ich die Betriebszeit eines bestimmten Linux-Prozesses heraus?
ps aux | grep gedit | grep -v grep
gibt mir eine ganze Menge Informationen, darunter auch die Zeit, zu der der Prozess gestartet wurde. Ich suche insbesondere nach einem Schalter, der die Betriebszeit eines Prozesses in Millisekunden angibt.
Danke
Antwort1
Da „Uptime“ mehrere Bedeutungen hat, hier ein nützlicher Befehl.
ps -eo pid,comm,lstart,etime,time,args
Dieser Befehl listet alle Prozesse mit mehreren zeitbezogenen Spalten auf. Er enthält die folgenden Spalten:
PID COMMAND STARTED ELAPSED TIME COMMAND
PID
= Prozess-ID
zuerst COMMAND
= nur der Befehlsname ohne Optionen und ohne Argumente
STARTED
= die absolute Zeit, zu der der Prozess gestartet wurde
ELAPSED
= verstrichene Zeit seit dem Start des Prozesses (wanduhr zeit), Format [[dd-]hh:]mm:ss
TIME
= kumulative CPU-Zeit, "[dd-]hh:mm:ss" Format
Sekunde COMMAND
= erneut der Befehl, dieses Mal mit allen bereitgestellten Optionen und Argumenten
Antwort2
Wenn Sie eine eingeschränkte Version von haben, ps
wie sie in zu finden ist busybox
, können Sie die Startzeit des Prozesses ermitteln, indem Sie sich den Zeitstempel von ansehen /proc/<PID>
. Wenn die PID, die Sie sich ansehen möchten, beispielsweise 55 ist...
# ls -al /proc | grep 55
dr-xr-xr-x 7 root root 0 May 21 05:53 55
... und anschließend mit dem aktuellen Datum vergleichen...
# date
Thu May 22 03:00:47 EDT 2014
Antwort3
Ich denke, Sie können einfach Folgendes ausführen:
$ stat /proc/1234
1234 ist die Prozess-ID.
Beispiel mit zwei Prozessen, die zur gleichen Stunde, Minute, Sekunde, aber nicht zur gleichen Millisekunde gestartet wurden:
$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100
Antwort4
So eine einfache Sache ist nach 5 Jahren noch immer nicht richtig beantwortet?
Ich glaube nicht, dass Sie Millisekunden genau berechnen können. Wenn Sie beispielsweise sehen, man procfs
welches /proc/$$/stat
Feld 22 als Startzeit hat, das in „Uhr-Ticks“ angegeben ist, hätten Sie etwas Präziseres, aber Uhr-Ticks laufen nicht mit einer perfekt konstanten Rate (relativ zur „Wanduhrzeit“) und werden abweichen... Schlafen und bestimmte Dinge (ntpd, nehme ich an) gleichen dies aus. Beispielsweise hat eine Maschine, auf der ntpd läuft, die 8 Tage lang aktiv war und nie geschlafen hat, dmesg -T
dasselbe Problem (glaube ich...), und Sie können es hier sehen:
# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar 3 10:26:17 CET 2017
[Fri Mar 3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w)
Fri Mar 3 10:26:17 CET 2017
Hier sind Sekunden:
# example pid here is just your shell
pid=$$
# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)
# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")
# simple subtraction (both are in UTC, so it works)
age=$((now-start))
printf "that process has run for %s seconds\n" "$age"