Як знайти тривалість роботи даного процесу Linux.
ps aux | grep gedit | grep -v grep
дає мені багато інформації, яка включає час, коли процес було розпочато. Я спеціально шукаю комутатор, який повертає час роботи в мілісекундах.
Дякую
Як знайти тривалість роботи даного процесу Linux.
ps aux | grep gedit | grep -v grep
дає мені багато інформації, яка включає час, коли процес було розпочато. Я спеціально шукаю комутатор, який повертає час роботи в мілісекундах.
Дякую
Відповіді:
Оскільки "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
= знову команда, на цей раз з усіма наданими параметрами та аргументами
Якщо у вас обмежена версія ps
такої busybox
, яку ви знайдете , ви можете отримати час початку процесу, переглянувши часові позначки /proc/<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
На таку просту річ правильно не відповідати через 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"
так, занадто старі та ще занадто важкі речі. Я спробував із запропонованим вище методом "stat", але що робити, якщо я вчора "доторкнувся" до PID proc Dir? Це означає, що мій річний процес відображається за допомогою вчорашньої позначки часу. Ні, не те, що мені потрібно :(
У нових версіях це просто:
ps -o etimes -p <PID>
ELAPSED
339521
так просто. Час присутній у секундах. Робіть все, що вам потрібно. З деякими старими скриньками ситуація складніше, оскільки немає часу. Можна покластися на:
ps -o etime -p <PID>
ELAPSED
76-03:26:15
які виглядають "трохи" дивно, оскільки це у форматі dd-hh: mm: ss. Не підходить для подальшого розрахунку. Я хотів би віддавати перевагу за лічені секунди, тому я використав цей:
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
etimes
собі - пройшов час в секундах - так це читається машиною