Як знайти тривалість процесу 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-] hh:] mm: ss TIME= накопичувальний Час процесора, "[dd-] hh: mm: ss" формат
секунда COMMAND= знову команда, на цей раз з усіма наданими параметрами та аргументами


1
Приємно. Я віддаю перевагу etimesсобі - пройшов час в секундах - так це читається машиною
Asfand Qazi

1
питання
стосувалося

на жаль, busybox 1.29.3 порушив форматування etime, тому не розраховуйте на його аналіз.
Денні Дулай

10

Якщо у вас обмежена версія 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

Здається, це більше не працює на поточних ядрах.
Ґерценатор

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

Це дійсно приємний спосіб зробити це на старих системах, дякую :)
RobotJohnny

не розбирайте вихід etime, тому що busybox 1.29.3 змінив формат. скористайтеся методом stat + / proc
Danny Dulai

-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.