Jak znaleźć czas sprawności procesu linux

69

Jak znaleźć czas pracy danego procesu linuksowego.

ps aux | grep gedit | grep -v grep

daje mi mnóstwo informacji, w tym czas, w którym proces został rozpoczęty. W szczególności szukam przełącznika, który zwraca czas bezawaryjności procesu w milisekundach.

Dzięki

Mahadevan Sreenivasan
źródło

Odpowiedzi:

113

Ponieważ „czas pracy” ma kilka znaczeń, oto przydatne polecenie.

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

To polecenie wyświetla listę wszystkich procesów z kilkoma różnymi kolumnami związanymi z czasem. Ma następujące kolumny:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID=
Najpierw identyfikator procesu COMMAND= tylko nazwa komendy bez opcji i bez argumentów
STARTED= czas bezwzględny proces został rozpoczęty
ELAPSED= czas, który upłynął od rozpoczęcia procesu ( czas zegara ściennego ), format [[dd-] hh:] mm: ss TIME= skumulowany Czas procesora, format „[dd-] hh: mm: ss”
sekunda COMMAND= ponownie polecenie, tym razem ze wszystkimi podanymi opcjami i argumentami

Abdull
źródło
1
Miły. Wolę etimessiebie - upływ czasu w sekundach - więc można go odczytać maszynowo
Asfand Qazi
1
pytanie dotyczyło czasu statycznego w milisekundach
yohann.martineau
niestety busybox 1.29.3 złamał formatowanie etime, więc nie polegaj na nim podczas analizowania.
Danny Dulai
10

Jeśli masz ograniczoną wersję, pstaką jak znajduje się w busybox, możesz uzyskać czas rozpoczęcia procesu, patrząc na znacznik czasu /proc/<PID>. Na przykład, jeśli pid, na który chcesz spojrzeć, to 55 ...

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

... a następnie porównaj go z bieżącą datą ...

# date
Thu May 22 03:00:47 EDT 2014
goertzenator
źródło
Wydaje się, że to już nie działa na obecnych jądrach.
goertzenator
7

Myślę, że możesz po prostu uruchomić:

$ stat /proc/1234

1234 jest identyfikatorem procesu.

przykład z dwoma procesami uruchomionymi w tej samej godzinie minuty sekund, ale nie w tych samych milisekundach:

$ 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
yohann.martineau
źródło
4

Takiej prostej rzeczy nie da się poprawnie odpowiedzieć po 5 latach?

Nie sądzę, że można dokładnie uzyskać milisekundy. na przykład. jeśli zobaczysz man procfsi zobaczysz, /proc/$$/statktóry ma pole 22 jako godzinę początkową, która jest w „tyknięciach zegara”, miałbyś coś bardziej precyzyjnego, ale tyknięcia zegara nie będą działały z idealnie stałą częstotliwością (w stosunku do „czasu zegara ściennego”) i będą odpocząć ... spać i pewne rzeczy (chyba ntpd) to zrównoważyły. Na przykład na komputerze z uruchomionym NTTP, z 8 dniami nieprzerwanego działania i nigdy nie spał, dmesg -Tma ten sam problem (tak myślę ...), i możesz to zobaczyć tutaj:

# 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

Oto sekundy:

# 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"
Piotr
źródło
3

tak, zbyt stare, a jednak zbyt trudne rzeczy. Próbowałem z wyżej zaproponowaną metodą „stat”, ale co jeśli wczoraj miałbym „dotknąć” PID proc dir? Oznacza to, że mój roczny proces jest pokazany z wczorajszym znacznikiem czasu. Nie, nie potrzebuję :(

W nowszych jest to proste:

ps -o etimes -p <PID>
ELAPSED
339521

tak proste jak to. Czas jest wyświetlany w sekundach. Rób, co potrzebujesz. W przypadku niektórych starszych pudełek sytuacja jest trudniejsza, ponieważ nie ma etimes. Można polegać na:

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

które wyglądają „trochę” dziwnie, ponieważ mają format dd-hh: mm: ss. Nie nadaje się do dalszych obliczeń. Wolałbym to w kilka sekund, dlatego użyłem tego:

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
Jerzy Iwanow
źródło
To naprawdę fajny sposób na zrobienie tego na starszych systemach, dzięki :)
RobotJohnny,
nie analizuj danych wyjściowych etime, ponieważ busybox 1.29.3 zmienił format. zamiast tego użyj metody stat + / proc
Danny Dulai
-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => identyfikator procesu dla procesu Java

etimes= => czas w sekundach, a „=” oznacza usunięcie nagłówka

Rohit
źródło