¿Cuándo comenzó un proceso?


31

Para saber cuándo se inició un proceso, mi primera suposición fue verificar la hora en que /proc/<pid>/cmdlinese escribió / modificó la última vez.

psTambién muestra un STARTcampo. Pensé que ambas fuentes serían las mismas. A veces no son lo mismo. ¿Cómo es posible?


Respuestas:


44

Al menos en Linux, también puedes hacer:

ps -o lstart= -p the-pid

para tener una hora de inicio más útil.

Sin embargo , tenga en cuenta que es el momento en que se inició el proceso , no necesariamente el momento en que se invocó el comando que está ejecutando actualmente. Los procesos pueden (y generalmente lo hacen) ejecutar más de un comando en su vida útil. Y los comandos a veces generan otros procesos.

Los tiempos de los archivos en /procLinux (al menos) generalmente son la fecha en que se instanciaron esos archivos, que sería la primera vez que algo intenta acceder a ellos o enumerar el contenido del directorio.

Por ejemplo:

$ 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

La expansión /proc/$$/xx*provocó que el shell leyera el contenido del /proc/$$cual se creó la cmdlineinstancia del archivo.

Consulte también: Marca de tiempo del socket en / proc // fd


11

proc es un sistema de archivos virtual, por lo que no confiaría en ninguna información de estado de archivos.

La hora de inicio del proceso se encuentra en / proc / PID / stat columna 22 . Se administra en segundos después del inicio del sistema. Para convertirlo a segundos, debe dividirlo entre sysconf(_SC_CLK_TCK)100 para la mayoría de los sistemas (¡pero no para todos!).

Para obtener el tiempo de inicio del sistema, usted determina el tiempo de actividad actual en segundos, que es el primer valor de / proc / uptime .

Al tener esos dos números, resta el primero del segundo y obtiene el número de segundos transcurridos desde que inició el programa.

Ejemplo (para 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

Nota: este simple ejemplo no funciona si pidofdevuelve PID multipe.


¿Alguna idea sobre cuándo se escribe proc / <pid> / cmdline? bien cualquiera de las entradas proc / <pid> para el caso.
Swair

2
Por lo general, el kernel genera esos archivos dinámicamente cada vez que intenta leerlos y la mayoría de ellos también tienen un contenido dinámico. cmdline no lo hace, pero no puedo imaginar que exista una política oficial que establezca que se debe crear una vez al inicio del proceso y que nunca se vuelva a tocar.
scai

Se puede obtener el valor _SC_CLK_TCK de línea de comandos ejecutando "CLK_TCK getconf"
oᴉɹǝɥɔ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.