Как узнать время запуска долго работающего процесса Linux? [закрыто]

251

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

ajwood
источник
16
Что-то не так с использованием ps -p <pid> -o lstart? Похоже, это работает, но я не уверен, почему это не является очевидным ответом для многих раз, когда кажется, что этот вопрос возникает.
Эйвуд
7
@ajwood Было бы лучше использовать, ps -p <pid> -o lstart=чтобы избежать печати дополнительной строки (заголовка).
Владимир Протасов
2
Что-то не так с использованием ps -p <pid> -o lstart? Может быть, тот факт, что нет lstartни в версии 2004 года, ни в версии 2013 года стандарта POSIX 1003.1?
Петр Доброгост
5
@PiotrDobrogost, это было бы проблемой, если бы вопрос задавался о POSIX, но о Linux.
Уомбл
4
Моды - techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - почему бы вам не переместить его на более подходящий сайт, такой как StackExchange или Superuser, вместо того, чтобы закрывать вопрос? Это хороший и полезный вопрос
Hanxue

Ответы:

394

Вы можете указать форматер и использовать 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или проверить страницу Opengroup для других форматеров.

WKL
источник
3
@ bobbyrne01: измените порядок, например, pid, etime, cmd работает для меня в Debian Wheezy.
Exic
1
@Gobliins - etimeвремя, прошедшее с начала процесса.
wkl
4
для полноты, для тех, кто привык к синтаксису BSD: ps axo pid,cmd,lstartтакже работает
Грэм Мосс
2
@ bobbyme01: используйте опцию -ww
Эд Рэндалл
1
Имейте в lstartвиду, что время может измениться, приведенные statниже методы безопаснее - unix.stackexchange.com/questions/274610/… .
SLM
43

Команда 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, смотрите /unix/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 $$" в этой оболочке ... .)

Натан
источник
Чтобы увидеть каждый процесс (не только ваш) добавьте аргумент e(стандартный psсинтаксис) или ax(синтаксис BSD) к команде ps: т.е. ps -ewo pid,lstart,cmdилиps -axwo pid,lstart,cmd
Райан Гриффит
15

В качестве последующих мер в ответ Адама Матана в , в /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 { printf "%9.0f\n", 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

Обновлен некоторыми исправлениями от Stephane Chazelas в комментариях; спасибо как всегда!

Если у вас есть только Mawk, возможно, попробуйте

awk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
  NR==1 { now=$1; next }
  END { printf "%9.0f\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 человек проц ; поиск времени начала .

tripleee
источник
Немного переработан для производственного использования: gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee
1
Имейте в виду, что strftime()и systime()нет mawk, что является значением по умолчанию awkв моих образах VPS Debian 8, поэтому я могу только предполагать, что они относятся к gawkдиалекту русского языка.
Ssokolow
13
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
Адам Матан
источник
6
Это не работает для меня - он печатает время модификации (часто меняется) Может быть из-за этого: unix.stackexchange.com/questions/20460/…
user920391
Временная метка / proc / <pid> не является надежной.
Хеннинг
1
Это вернуло время на 9 минут позже, чем когда процесс, о котором я имею информацию, фактически начался.
Дан Даскалеску
1
Кажется, это мой единственный вариант, который работает, хотя, возможно, и не надежный. У меня встроенная система, в которой есть только busybox, в psкотором указаны invalid optionвсе параметры, указанные в других ответах.
Ци Фан
7
Почему grep? Почему нет ls -ldh /proc/$pid? Или даже лучше date -r /proc/$pid?
Цезарь
6
    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
Переполнение стека
источник
1
Это будет включать в себя и свой собственный процесс
Пол Вершур