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


69

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

ps aux | grep gedit | grep -v grep

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

Спасибо

Ответы:


113

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

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

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

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

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


1
Приятно. Я предпочитаю etimesсебя - прошедшее время в секундах - так что это машиночитаемо
Асфанд Кази

1
вопрос был о статистическом времени в миллисекундах
yohann.martineau

к сожалению, busybox 1.29.3 прервал форматирование для etime, поэтому не полагайтесь на него при разборе.
Дэнни Дулай

10

Если у вас есть ограниченная версия, 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

1
Похоже, это больше не работает на текущих ядрах.
goertzenator

7

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

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

3

да, слишком старые и все же слишком тяжелые вещи. Я попытался с помощью предложенного выше метода «stat», но что, если у меня вчера был «прикосновение» к директории 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{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

Это действительно хороший способ сделать это на старых системах, спасибо :)
RobotJohnny

не анализируйте вывод etime, потому что busybox 1.29.3 изменил формат. вместо этого используйте метод stat + / proc
Дэнни Дулай

-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => идентификатор процесса для процесса Java

etimes= => время в секундах и '=' - удалить заголовок

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.