Когда начался процесс

31

Чтобы узнать, когда был запущен процесс, моей первой догадкой было проверить, когда /proc/<pid>/cmdlineбыл написан / изменен последний раз.

psтакже показывает STARTполе. Я думал, что оба этих источника будут одинаковыми. Иногда они не совпадают. Как это может быть?

Swair
источник

Ответы:

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 . Это дается в jiffies после загрузки системы. Чтобы преобразовать его в секунды, вы должны разделить его на sysconf(_SC_CLK_TCK)100 для большинства систем (но не для всех!).

Чтобы получить время загрузки системы, вы определяете текущее время работы в секундах, которое является первым значением / proc / uptime .

Имея эти два числа, вы вычитаете первое из второго и получаете количество секунд, прошедших с момента запуска программы.

Пример (для пиджина ):

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.

SCAI
источник
Есть идеи о том, когда в proc / <pid> / cmdline записывается? ну что-нибудь из записей proc / <pid> по этому вопросу.
Swair
2
Обычно эти файлы генерируются ядром динамически всякий раз, когда вы пытаетесь их прочитать, и большинство из них также имеют динамическое содержимое. cmdline этого не делает, но я не могу представить, что существует официальная политика, утверждающая, что она должна быть создана один раз при запуске процесса и никогда больше не затрагиваться.
Scai
Вы можете получить значение _SC_CLK_TCK из командной строки, выполнив «getconf CLK_TCK»
oᴉɹǝɥɔ