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

80191
Mahadevan Sreenivasan

Как мне найти время безотказной работы Linux?

ps aux | grep gedit | grep -v grep 

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

Спасибо

61

5 ответов на вопрос

102
Abdull

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

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

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

PID COMMAND STARTED ELAPSED TIME COMMAND 

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

Ницца. Я предпочитаю `etimes` сам - прошедшее время в секундах - так что это машиночитаемый Asfand Qazi 8 лет назад 1
вопрос был о статистическом времени в * миллисекундах * yohann.martineau 6 лет назад 0
К сожалению, busybox 1.29.3 прервал форматирование для etime, поэтому не полагайтесь на него при разборе. Danny Dulai 5 лет назад 0
8
goertzenator

If you have a limited version of ps such as is found in busybox, you can get the process start time by looking at the timestamp of /proc/<PID>. For example, if the pid you want to look at is 55...

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

... and then compare it with the current date...

# date Thu May 22 03:00:47 EDT 2014 
Похоже, это больше не работает на современных ядрах. goertzenator 6 лет назад 0
4
yohann.martineau

Я думаю, что вы можете просто запустить:

$ 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 
3
Peter

На такую ​​простую вещь не правильно ответили через 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" 
3
George Ivanov

да, слишком старые и все же слишком тяжелые вещи. Я попытался с помощью предложенного выше метода "stat", но что, если у меня вчера был "touch" -ed каталог PID proc? Это означает, что мой годовалый процесс показан со вчерашней отметкой времени. Нет, не то что мне нужно :(

В более новых, это просто:

ps -o etimes -p <PID> ELAPSED 339521 

так просто. Время присутствует в секундах. Делай то, что тебе нужно. С некоторыми старыми коробками ситуация сложнее, потому что времени нет. Можно полагаться на:

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

который выглядит немного странным, поскольку он находится в формате дд-чч: мм: сс. Не подходит для дальнейшего расчета. Я бы предпочел это в считанные секунды, поэтому я использовал это:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN;END' 339544 
Это действительно хороший способ сделать это на старых системах, спасибо :) RobotJohnny 5 лет назад 0
не анализируйте вывод etime, потому что busybox 1.29.3 изменил формат. вместо этого используйте метод stat + / proc Danny Dulai 5 лет назад 0

Похожие вопросы