Как найти время работы процесса Linux
Как мне найти время безотказной работы Linux?
ps aux | grep gedit | grep -v grep
дает мне много информации, включая время, когда процесс был запущен. Я специально ищу переключатель, который возвращает время безотказной работы процесса в миллисекундах.
Спасибо
8 ответов
Поскольку "uptime" имеет несколько значений, вот полезная команда.
ps -eo pid,comm,lstart,etime,time,args
Эта команда выводит список всех процессов с несколькими разными столбцами времени. Имеет следующие столбцы:
PID COMMAND STARTED ELAPSED TIME COMMAND
PID
= Идентификатор процесса
первый COMMAND
= только имя команды без параметров и без аргументовSTARTED
= абсолютное время начала процессаELAPSED
= время, прошедшее с начала процесса (времянастенных часов), формат [[dd-] чч:] мм: сс TIME
= совокупное время процессора, формат [[dd-] чч: мм: сс "
второй COMMAND
= снова команда, на этот раз со всеми предоставленными опциями и аргументами
Если у вас есть ограниченная версия 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
Я думаю, что вы можете просто запустить:
$ 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
Да , слишком старые и все же слишком тяжелые вещи. Я попытался с помощью предложенного выше метода "stat", но что, если я вчера сделал "touch"- 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
Такая простая вещь не отвечает должным образом через 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"
По имени процесса:
ps -eo pid,comm,lstart,etime,args | grep MyProcessName | cut -b 1-200
Где:
- это имя процесса.
- The
ps
перечисляет все процессы. - The
grep
фильтрует поMyProcessName
вargs
. - The
cut
перечисляет первые 200 символов в каждой строке. Полезно, поскольку командные строки Java часто бывают довольно длинными.
Выдает что-то вроде этого:
10673 java Tue Aug 25 12:26:30 2020 19:19:25 /opt/apps/java_home/bin/java -Dservice.name=MyProcessName1
10908 java Tue Aug 25 12:26:41 2020 19:19:14 /opt/apps/java_home/bin/java -Dservice.name=MyProcessName2
11062 java Tue Aug 25 12:26:52 2020 19:19:03 /opt/apps/java_home/bin/java -Dservice.name=MyProcessName3
Мы видим, что все сервисы стартовали 26 августа в 12:26, и ни один из них по каким-либо причинам не перезапустился.
с момента появления Systemd люди, которые ищут это с помощью дистрибутивов SystemD, могут использоватьsystemctl status option
. И получите время безотказной работы в выходных данных, как показано здесь:
● openkm.service - LSB: Start and stop OpenKM
Loaded: loaded (/etc/rc.d/init.d/openkm; bad; vendor preset: disabled)
Active: active (exited) since Tue 2021-04-20 09:27:13 CAT; 2 weeks 4 days ago
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
266433
pidof java
=> идентификатор процесса для процесса Java
etimes=
=> время в секундах и '=' - удалить заголовок