Как получить время начала долгого процесса Linux?

Можно ли получить время начала старого запуска? Кажется, что ps сообщит дату (а не время), если она не была запущена сегодня, и только год, если она не была запущена в этом году. Точность потеряна навсегда для старых процессов?

Ответ 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