Можно ли получить время начала старого запуска? Кажется, что ps
сообщит дату (а не время), если она не была запущена сегодня, и только год, если она не была запущена в этом году. Точность потеряна навсегда для старых процессов?
Как получить время начала долгого процесса Linux?
Ответ 1
Вы можете указать форматтер и использовать lstart
, как эта команда:
ps -eo pid,lstart,cmd
Вышеупомянутая команда выведет все процессы, с форматировщиками, чтобы получить PID, запуск команды и время.
Пример (из командной строки Debian/Jessie)
$ ps -eo pid,lstart,cmd
PID CMD STARTED
1 Tue Jun 7 01:29:38 2016 /sbin/init
2 Tue Jun 7 01:29:38 2016 [kthreadd]
3 Tue Jun 7 01:29:38 2016 [ksoftirqd/0]
5 Tue Jun 7 01:29:38 2016 [kworker/0:0H]
7 Tue Jun 7 01:29:38 2016 [rcu_sched]
8 Tue Jun 7 01:29:38 2016 [rcu_bh]
9 Tue Jun 7 01:29:38 2016 [migration/0]
10 Tue Jun 7 01:29:38 2016 [kdevtmpfs]
11 Tue Jun 7 01:29:38 2016 [netns]
277 Tue Jun 7 01:29:38 2016 [writeback]
279 Tue Jun 7 01:29:38 2016 [crypto]
...
Вы можете прочитать ps
manpage или проверить страницу Opengroup для других форматов.
Ответ 2
Команда ps (по крайней мере, версия procps, используемая многими дистрибутивами Linux) имеет несколько полей формата, которые относятся к времени начала процесса, включая lstart
, который всегда дает полную дату и время начала процесса:
# ps -p 1 -wo pid,lstart,cmd
PID STARTED CMD
1 Mon Dec 23 00:31:43 2013 /sbin/init
# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER PID %CPU %MEM VSZ RSS TT STAT STARTED CMD
root 1 0.0 0.1 2800 1152 ? Ss Mon Dec 23 00:31:44 2013 /sbin/init
root 5151 0.3 0.1 4732 1980 pts/2 S Sat Mar 8 16:50:47 2014 bash
Для обсуждения того, как информация публикуется в файловой системе /proc, см. https://unix.stackexchange.com/questions/7870/how-to-check-how-long-a-process-has-been-running
(По моему опыту в Linux, метка времени в каталоге/proc/выглядит, похоже, связана с моментом, когда виртуальный каталог был недавно получен, а не время начала процессов:
# date; ls -ld /proc/1 /proc/$$
Sat Mar 8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151
Обратите внимание, что в этом случае я запустил команду "ps -p 1" примерно в 16:50, а затем породил новую оболочку bash, а затем запустил команду "ps -p 1 -p $$" в этой оболочке вскоре после этого....)
Ответ 3
ls -ltrh /proc | grep YOUR-PID-HERE
Например, мой PID Google Chrome - 11583:
ls -l /proc | grep 11583
dr-xr-xr-x 7 adam adam 0 2011-04-20 16:34 11583
Ответ 4
В качестве ответа на ответ Адама Матана, метка времени каталога /proc/<pid>
как таковая не обязательно будет непосредственно полезна, но вы можете использовать
awk -v RS=')' 'END{print $20}' /proc/12345/stat
чтобы получить время начала в тактах с момента загрузки системы. 1
Это немного сложная единица; см. также конвертировать jiffies в секунды для деталей.
awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
END { print now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat
Это должно дать вам секунды, которые вы можете передать в strftime()
, чтобы получить отметку времени (для человека или для чтения).
awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat
Обновлен с некоторыми исправлениями Стефана Хазеласа в комментариях; спасибо, как всегда!
Если у вас есть только Mawk, попробуйте
avk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
NR==1 { now=$1; next }
END { printf "%9.0f", epoch - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}
1man proc; поиск времени начала.
Ответ 5
ps -eo pid,etime,cmd|sort -n -k2
Ответ 6
ps -eo pid,cmd,lstart | grep YOUR-PID-HERE