web-dev-qa-db-fra.com

Quand un processus a-t-il commencé

Pour savoir quand un processus a-t-il commencé, ma première hypothèse était de vérifier le moment où /proc/<pid>/cmdline a été écrit/modifié la dernière fois.

ps montre également un champ START. Je pensais que ces deux sources seraient les mêmes. Parfois, ils ne sont pas les mêmes. Comment cela pourrait-il être?

32
Swair

Sur Linux au moins, vous pouvez également faire:

ps -o lstart= -p the-pid

avoir un temps de départ plus utile.

Notez cependant que c'est l'heure du processus a été démarré, pas nécessairement le temps de la commande qu'il est actuellement exécutant a été invoqué. Les processus peuvent (et généralement faire) fonctionnent plus d'une commande dans leur vie. Et les commandes parcourent parfois d'autres processus.

Les mètres des fichiers de /proc sur Linux (au moins) est généralement la date à laquelle ces fichiers étaient instanciés, ce qui serait la première fois que quelque chose a essayé d'y accéder ou de répertorier le contenu de la répertoire.

Par exemple:

$ 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

Expansion /proc/$$/xx* a amené la coquille à lire le contenu de /proc/$$ qui a provoqué l'instanciation du fichier cmdline.

Voir aussi: horodatage de socket in/proc // fd

45
Stéphane Chazelas

PROC est un système de fichiers virtuel afin que je ne fasse pas compter sur des informations d'état de fichier.

L'heure de début du processus est située à / proc/pid/stat colonne 22. Il est donné dans les jiffs après la démarrage du système. Pour le convertir en secondes, vous devez le diviser par sysconf(_SC_CLK_TCK) qui est 100 pour la plupart systèmes (mais pas tous!).

Pour obtenir le temps de démarrage du système, vous déterminez la disponibilité actuelle en secondes, ce qui est la première valeur de / proc/uptime.

Avoir ces deux chiffres que vous soustrayez le premier de la seconde et que vous obtenez le nombre de secondes passées depuis le démarrage du programme.

Exemple (pour 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

Remarque: cet exemple simple ne fonctionne pas si pidof renvoie à plusieurs milles PIDS.

11
scai