So finden Sie die Verfügbarkeit eines Linux-Prozesses


69

Wie finde ich die Verfügbarkeit 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 Schalter, der die Betriebszeit eines Prozesses in Millisekunden zurückgibt.

Vielen Dank

Antworten:


113

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
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 bereitgestellten Optionen und Argumenten


1
Nett. Ich bevorzuge etimesmich selbst - verstrichene Zeit in Sekunden - damit es maschinenlesbar ist
Asfand Qazi


Leider hat busybox 1.29.3 die Formatierung für einige Zeit unterbrochen. Verlassen Sie sich beim Parsen nicht darauf.
Danny Dulai

10

Wenn Sie eine eingeschränkte Version von haben, pswie sie in zu finden ist busybox, können Sie die Startzeit des Prozesses anhand des Zeitstempels von abrufen /proc/<PID>. Wenn zum Beispiel die gewünschte PID 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

7

Ich denke du kannst einfach laufen:

$ stat /proc/1234

1234 ist die Prozess-ID.

Beispiel mit zwei Prozessen, die zur selben Stunde, Minute, Sekunde, aber nicht in derselben 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

4

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

Ich glaube nicht, dass Sie Millisekunden genau erhalten können. z.B. Wenn Sie sehen man procfsund sehen, /proc/$$/statwelches Feld 22 als Startzeit hat, was in "Uhr-Ticks" steht, würden Sie etwas genaueres haben, aber die Uhr-Ticks laufen nicht mit einer vollkommen konstanten Rate (relativ zur "Wanduhr-Zeit") und werden ausschlafen ... und bestimmte Dinge (ntpd nehme ich an) glichen es aus. Beispiel: Auf einem Computer, auf dem ntpd ausgeführt wird, der 8 Tage verfügbar ist und noch nie geschlafen dmesg -That, tritt dasselbe Problem auf (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 ist 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

ja, zu alt und doch zu hart. Ich habe es mit der oben vorgeschlagenen "stat" -Methode versucht, aber was ist, wenn ich gestern die PID-Prozedur "berührt" habe? Dies bedeutet, dass mein einjähriger 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. Die Zeit ist in Sekunden angegeben. Mach, wofür du es brauchst. Bei einigen älteren Boxen ist die Situation schwieriger, da es keine Zeiten gibt. Man kann sich verlassen auf:

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

die ein "bisschen" komisch aussehen, da sie im dd-hh: mm: ss-Format vorliegen. Nicht zur weiteren Berechnung geeignet. Ich hätte es in Sekunden vorgezogen, daher habe ich diese 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

Dies ist eine wirklich gute Möglichkeit, es auf den älteren Systemen zu tun, danke :)
RobotJohnny

Analysieren Sie nicht die Ausgabe von etime, da busybox 1.29.3 das Format geändert hat. Verwenden Sie stattdessen die stat + / proc-Methode
Danny Dulai

-1
[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 '=' dient zum Entfernen des Headers

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.