Подтвердить что ты не робот

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

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

4b9b3361

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