Коли було розпочато процес


31

Щоб знати, коли був запущений процес, першою моєю здогадкою було перевірити час, коли /proc/<pid>/cmdlineбув написаний / змінений останній раз.

psтакож показує STARTполе. Я думав, що обидва ці джерела будуть однаковими. Іноді вони не однакові. Як це могло бути?


Відповіді:


44

Щонайменше, у Linux ви також можете:

ps -o lstart= -p the-pid

мати корисніший час початку.

Однак зауважте, що це час запуску процесу , а не обов'язково час виклику команди, яку він виконує. Процеси можуть (і як правило, виконувати) декілька команд протягом життя. І команди іноді породжують інші процеси.

Тимчасові файли в /procLinux (принаймні), як правило, є датою, коли ці файли були ініціалізовані, що було б вперше, коли щось намагалось отримати доступ до них або перерахувати вміст каталогу.

Наприклад:

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

Розширення /proc/$$/xx*змусило оболонку зчитувати вміст, /proc/$$який спричинив cmdlineекземпляр файлу.

Дивіться також: Часова мітка сокета в / proc // fd


11

proc - це віртуальна файлова система, тому я б не покладався на будь-яку інформацію про стан файлу.

Час початку процесу знаходиться в / proc / PID / stat стовпці 22 . Він подається в "джиффах" після завантаження системи. Щоб перетворити його на секунди, ви повинні розділити його на sysconf(_SC_CLK_TCK)100 для більшості систем (але не для всіх!).

Щоб отримати час завантаження системи, ви визначаєте поточний час роботи в секундах, що є першим значенням / proc / uptime .

Маючи ці два числа, ви віднімаєте перше від другого і отримуєте кількість секунд, що пройшли з моменту запуску програми.

Приклад (для pidgin ):

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

Примітка. Цей простий приклад не працює, якщо pidofповертає багаторазові PID.


Будь-яке уявлення про те, коли записується proc / <pid> / cmdline? ну будь-які записи про / <pid> запитання з цього питання.
Swair

2
Зазвичай ці файли генеруються ядром динамічно, коли ви намагаєтесь прочитати їх, і більшість з них також мають динамічний вміст. cmdline не дає, але я не можу уявити, що існує офіційна політика, яка повинна бути створена один раз під час запуску процесу і ніколи не торкатися знову.
scai

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