Quand a commencé un processus

31

Pour savoir quand un processus a commencé, ma première supposition a été de vérifier l'heure à laquelle il a /proc/<pid>/cmdlineété écrit / modifié la dernière fois.

psaffiche également un STARTchamp. Je pensais que ces deux sources seraient les mêmes. Parfois, ce ne sont pas les mêmes. Comment cela pourrait-il être?

Swair
la source

Réponses:

44

Sous Linux au moins, vous pouvez également faire:

ps -o lstart= -p the-pid

d'avoir une heure de début plus utile.

Notez cependant que c'est l'heure à laquelle le processus a été démarré, pas nécessairement l'heure à laquelle la commande qu'il exécute actuellement a été invoquée. Les processus peuvent (et exécutent généralement) plusieurs commandes au cours de leur vie. Et les commandes engendrent parfois d'autres processus.

Les temps des fichiers dans /procLinux (au moins) sont généralement la date à laquelle ces fichiers ont été instanciés, ce qui serait la première fois que quelque chose tentait d'y accéder ou de répertorier le contenu du 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

L'expansion a /proc/$$/xx*provoqué la lecture du contenu du shell, /proc/$$ce qui a provoqué l' cmdlineinstanciation du fichier.

Voir aussi: Horodatage du socket dans / proc // fd

Stéphane Chazelas
la source
11

proc est un système de fichiers virtuel, donc je ne compterais sur aucune information sur l'état des fichiers.

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

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

Ayant ces deux nombres, vous soustrayez le premier du second et vous obtenez le nombre de secondes écoulé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 pidofrenvoie des PID multipe.

scai
la source
Une idée de quand écrit proc / <pid> / cmdline? ainsi toutes les entrées proc / <pid> d'ailleurs.
Swair du
2
Habituellement, ces fichiers sont générés dynamiquement par le noyau chaque fois que vous essayez de les lire et la plupart d'entre eux ont également un contenu dynamique. cmdline ne le fait pas mais je ne peux pas imaginer qu'il existe une politique officielle qui doit être créée une fois au démarrage du processus et ne plus jamais être touchée.
scai
Vous pouvez obtenir la valeur _SC_CLK_TCK à partir de la ligne de commande en exécutant "getconf CLK_TCK"
oᴉɹǝɥɔ