Kiedy rozpoczął się proces

31

Aby wiedzieć, kiedy rozpoczął się proces, najpierw zgadywałem, kiedy sprawdzono, kiedy /proc/<pid>/cmdlineostatni raz został napisany / zmodyfikowany.

pspokazuje również STARTpole. Myślałem, że oba te źródła będą takie same. Czasami nie są takie same. Jak to możliwe?

Swair
źródło

Odpowiedzi:

44

Przynajmniej w systemie Linux możesz także:

ps -o lstart= -p the-pid

mieć bardziej przydatny czas rozpoczęcia.

Należy jednak pamiętać, że jest to czas, w którym proces został rozpoczęty, niekoniecznie razem komenda , że aktualnie realizuje została wywołana. Procesy mogą (i generalnie wykonują) wykonywać więcej niż jedno polecenie w ciągu swojego życia. A polecenia czasami spawnują inne procesy.

Czasami plików w /procsystemie Linux (przynajmniej) są zazwyczaj daty utworzenia tych plików, co byłoby pierwszą próbą uzyskania do nich dostępu lub wyświetlenia zawartości katalogu.

Na przykład:

$ 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

Rozwinięcie /proc/$$/xx*spowodowało odczytanie przez powłokę zawartości, /proc/$$która spowodowała utworzenie cmdlinepliku.

Zobacz także: Znacznik czasu gniazda w / proc // fd

Stéphane Chazelas
źródło
11

proc to wirtualny system plików, więc nie polegałbym na żadnych informacjach o stanie pliku.

Czas rozpoczęcia procesu znajduje się w kolumnie / proc / PID / stat 22 . Jest podawany w jiffies po uruchomieniu systemu. Aby przekonwertować go na sekundy, musisz podzielić go przez sysconf(_SC_CLK_TCK)100 dla większości systemów (ale nie wszystkich!).

Aby uzyskać czas rozruchu systemu, określ bieżący czas działania w sekundach, który jest pierwszą wartością / proc / uptime .

Mając te dwie liczby, odejmujesz pierwszą od drugiej i otrzymujesz liczbę sekund, które upłynęły od uruchomienia programu.

Przykład (dla 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

Uwaga: ten prosty przykład nie działa, jeśli pidofzwraca wiele PID-ów.

scai
źródło
Masz pojęcie, kiedy zapisywane są proc / <pid> / cmdline? cóż, każdy z proc / <pid> wpisów w tym zakresie.
Swair
2
Zwykle pliki te są generowane przez jądro dynamicznie za każdym razem, gdy próbujesz je odczytać, a większość z nich ma również zawartość dynamiczną. cmdline nie robi, ale nie wyobrażam sobie, aby istniała oficjalna polityka, która musi zostać utworzona raz podczas uruchamiania procesu i nigdy więcej nie zostanie zmieniona.
scai
Możesz uzyskać wartość _SC_CLK_TCK z wiersza poleceń, wykonując polecenie „getconf CLK_TCK”
o