web-dev-qa-db-fra.com

Comment vérifier depuis combien de temps un processus s'exécute?

Je voudrais éviter de le faire en lançant le processus à partir d'une application de surveillance.

250
tshepang

Sous Linux avec le ps de procps(-ng) (et la plupart des autres systèmes puisque cela est spécifié par POSIX):

ps -o etime= -p "$$" 

$$ Est le PID du processus que vous souhaitez vérifier. Cela renverra le temps écoulé au format [[dd-]hh:]mm:ss.

L'utilisation de -o etime Indique à ps que vous voulez juste le champ de temps écoulé, et le = À la fin de cela supprime l'en-tête (sans, vous obtenez une ligne qui dit ELAPSED puis l'heure sur la ligne suivante; avec, vous obtenez une seule ligne avec l'heure).

Ou, avec les versions plus récentes de la suite d'outils procps-ng (3.3.0 ou supérieure) sur Linux ou sur FreeBSD 9.0 ou supérieure (et éventuellement d'autres), utilisez:

ps -o etimes= -p "$$"

(avec un s) ajouté pour obtenir le temps formaté en secondes, ce qui est plus utile dans les scripts.

Sous Linux, le programme ps obtient cela de /proc/$$/stat, Où l'un des champs (voir man proc) Est l'heure de début du processus. Ceci est, malheureusement, spécifié pour être le temps en jiffies (un compteur de temps arbitraire utilisé dans le noyau Linux) depuis le démarrage du système. Vous devez donc déterminer l'heure à laquelle le système a démarré (à partir de /proc/stat), Le nombre de jiffies par seconde sur ce système, puis faire le calcul pour obtenir le temps écoulé dans un format utile.

Il s'avère ridiculement compliqué de trouver la valeur de HZ (c'est-à-dire des jiffies par seconde). A partir des commentaires dans sysinfo.c Dans le paquetage procps, on peut A) inclure le fichier d'en-tête du noyau et recompiler si un autre noyau est utilisé, B) utiliser la fonction posix sysconf(), qui, malheureusement, utilise une valeur codée en dur compilée dans la bibliothèque C, ou C) demande au noyau, mais il n'y a pas d'interface officielle pour le faire. Ainsi, le code ps inclut une série de kludges par lesquels il détermine la valeur correcte. Sensationnel.

Il est donc pratique que ps fasse tout cela pour vous. :)

Comme le note l'utilisateur @ 336_, sous Linux (ce n'est pas portable), vous pouvez utiliser la commande stat pour consulter les dates d'accès, de modification ou de changement d'état pour le répertoire /proc/$$ (Où à nouveau $$ Est le processus qui vous intéresse). Les trois nombres doivent être identiques, donc

stat -c%X /proc/$$

vous donnera l'heure à laquelle le processus $$ a commencé, en secondes depuis l'Époque. Ce n'est toujours pas tout à fait ce que vous voulez, car vous devez toujours faire le calcul pour soustraire cela de l'heure actuelle pour obtenir le temps écoulé - je suppose que quelque chose comme date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" fonctionnerait, mais c'est un peu disgracieux. Un avantage possible est que si vous utilisez la sortie au format long comme -c%x Au lieu de -c%X, Vous obtenez une résolution supérieure aux secondes en nombre entier. Mais, si vous en avez besoin, vous devriez probablement utiliser une approche d'audit de processus car le moment de l'exécution de la commande stat va interférer avec la précision.

324
mattdm

Portable:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

c'est-à-dire que Shell a été démarré le 30 janvier et totalisait environ 6 secondes de temps processeur.

Il peut y avoir des moyens plus précis ou plus analysables mais moins portables d'obtenir ces informations. Consultez la documentation de votre commande ps ou de votre système de fichiers proc.

Sous Linux, ces informations se trouvent dans /proc/$pid/stat .

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

Le temps processeur est en quelques secondes; Je ne sais pas par hasard comment trouver la valeur Jiffy à partir du Shell. L'heure de début est relative à l'heure de démarrage (trouvée dans /proc/uptime).

ps -eo pid,comm,cmd,start,etime | grep -i X

X est le nom du processus

19
mezi

ps prend un -o option pour spécifier le format de sortie, et l'une des colonnes disponibles est etime. Selon la page de manuel:

etime - temps écoulé depuis le début du processus, sous la forme [[jj-] hh:] mm: ss.

Ainsi, vous pouvez l'exécuter pour obtenir le PID et le temps écoulé de chaque processus:

$ ps -eo pid,etime

Si vous voulez le temps écoulé d'un PID particulier (par exemple 12345), vous pouvez faire quelque chose comme:

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

( Edit : Il s'avère qu'il existe une syntaxe plus courte pour la commande ci-dessus; voir réponse de mattdm )

13
Michael Mrozek

Vous ne savez pas pourquoi cela n'a pas encore été suggéré: sous Linux vous pouvez stat() le répertoire/proc/[nnn] pour votre PID.

Ce comportement est explicitement conçu pour renvoyer l'heure de début du processus, ce qu'il peut faire à haute résolution et que le noyau peut faire avec précision sans les hacks jiffies puisque le noyau peut (évidemment) simplement vérifier les informations pertinentes. Les champs d'accès, de modification des données et de changement d'état renvoient tous l'heure de début du processus.

Mieux encore, vous pouvez utiliser stat(1) sur le shell, ou la liaison appropriée à stat(2) à partir de $ favorite_programming_language, de sorte que vous n'aurez peut-être même pas besoin de lancer un processus externe.

NOTEZ que cela fonctionne pas fonctionne avec /usr/compat/linux/proc sur FreeBSD; les heures d'accès/modification/changement d'état renvoyées sont l'heure actuelle et l'heure de naissance est l'époque UNIX. Assez stupide, le soutien n'est pas là si vous me le demandez.

5
i336_

Si vous pouvez exécuter le temps, puis exécuter une commande, vous obtiendrez exactement ce que vous recherchez. Vous ne pouvez pas le faire contre une commande déjà en cours d'exécution.

[0]% de temps de sommeil 20

veille 20 0,00s utilisateur 0,00s système 0% cpu 20,014 au total

2
slashdot

$ ps -eo lstart obtenir l'heure de début

$ ps -eo etime obtenir la durée/le temps écoulé

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819 est l'ID de processus.

2
Terry wang

Temps écoulé en secondes: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)

1
Shardj

vous pouvez obtenir l'heure de début du processus en consultant le stat du fichier de statistiques produit par proc, le formater à l'aide de date et le soustraire de l'heure actuelle:

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

13494 est le pid de votre processus

1
bobbins