So finden Sie die Verfügbarkeit eines Linux-Prozesses

80338
Mahadevan Sreenivasan

Wie finde ich die Verfügbarkeit eines bestimmten Linux-Prozesses?

ps aux | grep gedit | grep -v grep 

gibt mir eine 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.

Vielen Dank

61

5 Antworten auf die Frage

102
Abdull

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

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

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

PID COMMAND STARTED ELAPSED TIME COMMAND 

PID= Prozess - ID
zuerst COMMAND= nur die Befehlsnamen ohne Optionen und ohne Argumente
STARTED= die absolute Zeit wurde der Prozess gestartet
ELAPSEDverstrichene Zeit =, da der Prozess gestartet wurde ( Wanduhr Zeit ), das Format [[dd-] hh:] mm: ss TIME= kumulative CPU-Zeit, "[dd-] hh: mm: ss" format
second COMMAND= erneut der Befehl, diesmal mit allen ihm zur Verfügung gestellten Optionen und Argumenten

Nett. Ich bevorzuge "etimes" selbst - die verstrichene Zeit in Sekunden - also ist es maschinenlesbar Asfand Qazi vor 8 Jahren 1
die frage war über stat zeit in * millisekunden * yohann.martineau vor 6 Jahren 0
Leider hat busybox 1.29.3 die Formatierung für etime durchbrochen, verlassen Sie sich also nicht beim Parsen darauf. Danny Dulai vor 5 Jahren 0
8
goertzenator

Wenn Sie eine eingeschränkte Version haben, pswie z. B. in busybox, können Sie die Startzeit des Prozesses ermitteln, indem Sie den Zeitstempel von betrachten /proc/<PID>. Wenn zum Beispiel die PID, die Sie anzeigen möchten, 55 ist ...

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

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

# date Thu May 22 03:00:47 EDT 2014 
Dies scheint auf aktuellen Kerneln nicht mehr zu funktionieren. goertzenator vor 6 Jahren 0
4
yohann.martineau

Ich denke, du kannst einfach laufen:

$ stat /proc/1234 

1234 ist die Prozess-ID.

Beispiel mit zwei Prozessen, die in derselben Stunde, 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 
3
Peter

Eine so einfache Sache wird nach 5 Jahren nicht richtig beantwortet?

Ich glaube nicht, dass Sie Millisekunden genau bekommen können. z.B. Wenn Sie man procfs sehen und / proc / $$ / stat sehen, das Feld 22 als Startzeit hat, was in "Clock Ticks" steht, hätten Sie etwas genaueres, aber die Clock Ticks laufen nicht mit einer absolut konstanten Rate ab (relativ zu "Wanduhrzeit") und wird aus sein ... schlafend und bestimmte Dinge (ntpd, denke ich) kompensieren es. Zum Beispiel auf einer Maschine, auf der ntpd läuft, mit 8 Tagen Betriebszeit und noch nie geschlafen hat, hat dmesg -T das gleiche Problem (ich denke ...), 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" 
3
George Ivanov

ja, zu alt und doch zu hartes Zeug. Ich habe es mit der oben vorgeschlagenen "stat" -Methode versucht, aber was wäre, wenn ich gestern den PID-Prozess dir "berühren" würde? Dies bedeutet, dass mein jahrelanger Prozess mit dem Zeitstempel von gestern angezeigt wird. Nein, nicht was ich brauche :(

In den neueren ist es einfach:

ps -o etimes -p <PID> ELAPSED 339521 

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

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

die sehen ein bisschen komisch aus, da es im Format dd-hh: mm: ss ist. Nicht zur weiteren Berechnung geeignet. Ich hätte es in Sekunden vorgezogen, daher habe ich dieses verwendet:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN;END' 339544 
Dies ist eine sehr gute Möglichkeit, dies auf älteren Systemen zu tun, danke :) RobotJohnny vor 5 Jahren 0
analysieren Sie die Ausgabe von etime nicht, da busybox 1.29.3 das Format geändert hat. Verwenden Sie stattdessen die stat + / proc-Methode Danny Dulai vor 5 Jahren 0