Как узнать время безотказной работы процесса Linux

Как узнать время безотказной работы процесса Linux

Как узнать время безотказной работы определенного процесса Linux?

ps aux | grep gedit | grep -v grep

дает мне массу информации, включая время запуска процесса. Я специально ищу switch, который возвращает время безотказной работы процесса в миллисекундах.

Спасибо

решение1

Поскольку «uptime» имеет несколько значений, вот полезная команда.

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

Эта команда выводит список всех процессов с несколькими различными столбцами, связанными со временем. Она имеет следующие столбцы:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID
= Сначала идентификатор процесса COMMAND= только имя команды без параметров и аргументов
STARTED= абсолютное время запуска процесса
ELAPSED= время, прошедшее с момента запуска процесса (время настенных часов), формат [[dd-]hh:]mm:ss TIME= совокупное время ЦП, формат "[dd-]hh:mm:ss"
секунда COMMAND= снова команда, на этот раз со всеми предоставленными ей опциями и аргументами

решение2

Если у вас ограниченная версия, psнапример, такая, как в busybox, вы можете узнать время начала процесса, посмотрев на временную метку /proc/<PID>. Например, если pid, который вы хотите посмотреть, равен 55...

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

... а затем сравните его с текущей датой...

# date
Thu May 22 03:00:47 EDT 2014

решение3

Я думаю, можно просто запустить:

$ stat /proc/1234

1234 — идентификатор процесса.

пример с двумя процессами, запущенными в одни и те же часы, минуты, секунды, но не в одни и те же миллисекунды:

$ 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

На такую ​​простую вещь не дали адекватного ответа спустя 5 лет?

Я не думаю, что вы можете точно получить миллисекунды. например, если вы видите man procfsи видите /proc/$$/stat, что имеет поле 22 как время запуска, которое в "тиках часов", вы бы имели что-то более точное, но тики часов не идут с идеально постоянной скоростью (относительно "времени настенных часов") и будут выключены... спящий режим и некоторые вещи (я полагаю, ntpd) компенсируют это. Например, на машине, на которой запущен ntpd, с 8 днями безотказной работы и никогда не спящим, dmesg -Tесть та же проблема (я думаю...), и вы можете увидеть ее здесь:

# 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

Вот секунды:

# 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"

Связанный контент