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

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

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

По крайней мере на Linux вы также можете:

 ps -o lstart= -p the-pid 

чтобы иметь более полезное время начала.

Обратите внимание, однако, что настало время, когда процесс был запущен, а не обязательно время, когда была вызвана команда , выполняемая в данный момент. Процессы могут (и обычно) запускать более одной команды за всю свою жизнь. И команды иногда порождают другие процессы.

Mtimes файлов в /proc на Linux (по крайней мере), как правило, это дата, когда эти файлы были созданы, что в первый раз попытается получить к ним доступ или перечислить содержимое каталога.

Например:

 $ 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

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

Время начала процесса находится в столбце / proc / PID / stat 22 . Он предоставляется в jiffies после загрузки системы. Чтобы преобразовать его в несколько секунд, вы должны разделить его на 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 возвращает multid PID.