Як отримати час початку тривалого процесу Linux? [зачинено]


250

Чи можливо отримати час початку старого запущеного процесу? Здається, psбуде повідомлено дату (не час), якщо вона не була розпочата сьогодні, і лише рік, якщо вона не була розпочата цього року. Чи втрачена точність назавжди для старих процесів?


16
Чи є щось погано з використанням ps -p <pid> -o lstart? Здається, це працює, але я не впевнений, чому це питання не завжди є очевидним, коли багато разів, як видається, виникає це питання.
ajwood

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, Tyvarev, Paul Roub - чому б вам не перенести його на більш підходящий сайт, наприклад StackExchange або Superuser, замість того, щоб закрити питання? Це гарне і корисне питання
Hanxue

Відповіді:


392

Ви можете вказати формат і використовувати 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]                    
      ...

Ви можете прочитати manpageps або переглянути сторінку Opengroup для інших форматів.


3
@ bobbyrne01: змінити порядок, наприклад, pid, etime, cmd працює для мене на Debian Wheezy.
exic

1
@Gobliins - etimeчас, що минув з моменту запуску процесу.
wkl

4
для повноти для тих, хто звик до синтаксису BSD: ps axo pid,cmd,lstartтакож працює
Graeme Moss

2
@ bobbyme01: скористайтеся опцією -ww
Ед Рандалл

1
Майте в виду , що lstartчас може змінюватися, statметоди нижче безпечніше - unix.stackexchange.com/questions/274610 / ... .
slm

43

Команда ps (принаймні версія propps, яка використовується багатьма дистрибутивами 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 $$" в цій оболонці незабаром після цього ... .)


Щоб побачити кожен процес (не лише власний), додайте аргумент e(стандартний psсинтаксис) або ax(BSD синтаксис) до команди ps: тобто ps -ewo pid,lstart,cmdабоps -axwo pid,lstart,cmd
Ryan Griffith

15

Як відповідь до відповіді Адама Матана , /proc/<pid>часова мітка каталогу як такої не обов'язково безпосередньо корисна, але ви можете використовувати

awk -v RS=')' 'END{print $20}' /proc/12345/stat

щоб отримати час початку роботи в годинникових галочках з моменту завантаження системи. 1

Це трохи складний пристрій для використання; див. також перетворення джиффі в секунди для деталей.

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

Оновлено деякі виправлення Стефана Шазеласа в коментарях; дякую як завжди!

Якщо у вас є тільки 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 чоловік проц ; пошук часу початку .


Трохи реконструюється для виробництва: gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee

1
Майте на увазі, що strftime()і systime()немає mawk, що є типовим awkу моїх зображеннях Debian 8 VPS, тому я можу лише припускати, що вони характерні для 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
Це здається моїм єдиним варіантом, який працює, хоча, можливо, не є надійним. Я перебуваю на вбудованій системі, яка має лише зайнятий ящик, psякий говорить invalid optionпро всі варіанти, згадані іншими відповідями.
Ци Фан

7
Чому grep? Чому ні ls -ldh /proc/$pid? Або ще краще date -r /proc/$pid,?
Цезар


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.