So finden Sie die Betriebszeit eines linux-Prozesses

Wie finde ich die Betriebszeit eines bestimmten Linux-Prozesses?

ps aux | grep gedit | grep -v grep

Gibt mir eine ganze Menge Informationen, einschließlich der Zeit, zu der der Prozess gestartet wurde. Ich suche speziell nach einem Switch, der die Betriebszeit eines Prozesses in Millisekunden zurückgibt.

Danke

Author: Mahadevan Sreenivasan, 2012-01-20

7 answers

Da "uptime" mehrere Bedeutungen hat, ist hier ein nützlicher Befehl.

ps -eo pid,comm,lstart,etime,time,args

Dieser Befehl listet alle Prozesse mit verschiedenen zeitbezogenen Spalten auf. Es hat die folgenden Spalten:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID = Prozess-ID
first 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 (wall clock time ), Format [[tt -] hh:] mm: ss TIME = kumulative CPU-Zeit, "[TT-]hh:mm:ss" format
second COMMAND = wieder der Befehl, diesmal mit all seinen bereitgestellten Optionen und Argumenten

 129
Author: Abdull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-08-21 14:46:10

Wenn Sie eine begrenzte Version von ps haben, wie sie in busybox zu finden ist, können Sie die Prozessstartzeit abrufen, indem Sie den Zeitstempel von /proc/<PID> betrachten. Zum Beispiel, wenn die PID, die Sie betrachten möchten, 55 ist...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55

... und dann vergleichen Sie es mit dem aktuellen Datum...

# date
Thu May 22 03:00:47 EDT 2014
 13
Author: goertzenator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-07-14 16:33:22

Ich denke, du kannst einfach laufen:

$ stat /proc/1234

1234 ist die Prozess-ID.

Beispiel mit zwei Prozessen, die zu derselben Stunde in Sekunden, aber nicht in Millisekunden 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
 8
Author: yohann.martineau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-11-15 13:01:24

Ja, zu altes und doch zu hartes Zeug. Ich habe es mit der oben vorgeschlagenen "stat" - Methode versucht, aber was wäre, wenn ich gestern das PID-Proc-Dir "berühren"würde? Dies bedeutet, dass mein einjähriger Prozess mit dem gestrigen Zeitstempel angezeigt wird. Nee, nicht was ich brauche : (

In den neueren ist es einfach:

ps -o etimes -p <PID>
ELAPSED
339521

So einfach ist das. Die Zeit ist in Sekunden. Tun Sie, wofür Sie es brauchen. Bei einigen älteren Boxen ist die Situation schwieriger, da es keine Etimes gibt. Man könnte sich verlassen auf:

ps -o etime -p <PID>
ELAPSED
76-03:26:15

Die ein " a " aussehen bit " seltsam, da es im dd-hh:mm: ss Format ist. Nicht für weitere Berechnungen geeignet. Ich hätte es in Sekunden vorgezogen, daher habe ich dieses verwendet:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544
 5
Author: George Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-08-27 11:57:03

So eine einfache Sache wird nach 5 Jahren nicht richtig beantwortet?

Ich glaube nicht, dass Sie Millisekunden genau bekommen können. z. wenn Sie man procfs sehen und /proc/$$/stat sehen, das Feld 22 als Startzeit hat, was in "clock ticks" ist, hätten Sie etwas Präziseres, aber clock Ticks gehen nicht mit einer vollkommen konstanten Rate (relativ zu 'Wanduhr Zeit') und wird ausgeschaltet sein... schlafen und bestimmte Dinge (ntpd denke ich) kompensieren es. Zum Beispiel auf einem Computer mit ntpd, mit 8 Tagen Betriebszeit und hat noch nie schlief, dmesg -T hat das gleiche 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"
 5
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-04-21 10:51:22

Nach Prozessname:

ps -eo pid,comm,lstart,etime,args | grep MyProcessName | cut -b 1-200

Wobei:

  • MyProcessName ist der Prozessname.
  • Das ps listet alle Prozesse auf.
  • Das grep filtert nach MyProcessName in args.
  • Das cut listet die ersten 200 Zeichen in jeder Zeile auf. Nützlich, da Java-Befehlszeilen oft ziemlich lang sind.

Erzeugt so etwas:

 10673 java            Tue Aug 25 12:26:30 2020    19:19:25 /opt/apps/java_home/bin/java -Dservice.name=MyProcessName1
 10908 java            Tue Aug 25 12:26:41 2020    19:19:14 /opt/apps/java_home/bin/java -Dservice.name=MyProcessName2
 11062 java            Tue Aug 25 12:26:52 2020    19:19:03 /opt/apps/java_home/bin/java -Dservice.name=MyProcessName3

Wir können sehen, dass alle Dienste am 26.August um 12:26 Uhr gestartet wurden und keiner von ihnen aus irgendeinem Grund neu gestartet wurde.

 0
Author: Contango,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-08-26 07:49:40
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => Prozess-id für java-Prozess

etimes= => Zeit in Sekunden und '=' ist zu entfernen header

 -1
Author: Rohit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-01-07 23:08:32