93 votes

Comment trouver le temps de fonctionnement d'un processus linux ?

Comment puis-je trouver le temps de fonctionnement d'un processus linux donné ?

ps aux | grep gedit | grep -v grep

me donne tout un tas d'informations, dont l'heure à laquelle le processus a été lancé. Je recherche spécifiquement un commutateur qui renvoie le temps de fonctionnement d'un processus en millisecondes.

Merci

151voto

Abdull Points 1920

Comme "uptime" a plusieurs significations, voici une commande utile.

ps -eo pid,comm,lstart,etime,time,args

Cette commande liste tous les processus avec plusieurs colonnes différentes liées au temps. Elle comporte les colonnes suivantes :

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID = ID du processus
premièrement COMMAND = uniquement le nom de la commande sans options et sans arguments
STARTED = l'heure absolue à laquelle le processus a été lancé
ELAPSED = temps écoulé depuis le début du processus ( heure de l'horloge murale ), format [[dd-]hh :]mm:ss TIME = temps CPU cumulé, format "[dd-]hh:mm:ss".
deuxième COMMAND = à nouveau la commande, cette fois avec toutes ses options et arguments fournis

20voto

goertzenator Points 470

Si vous avez une version limitée de ps tel qu'on le trouve dans busybox vous pouvez obtenir l'heure de début du processus en regardant l'horodatage de l'élément suivant /proc/<PID> . Par exemple, si le pid que vous voulez regarder est 55...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55

... et ensuite la comparer avec la date actuelle...

# date
Thu May 22 03:00:47 EDT 2014

12voto

yohann.martineau Points 316

Je pense que tu peux juste courir :

$ stat /proc/1234

1234 étant l'identifiant du processus.

exemple avec deux processus démarrés à la même heure minute seconde mais pas aux mêmes millisecondes :

$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100

7voto

George Ivanov Points 161

Oui, trop vieux et pourtant trop dur. J'ai essayé avec la méthode "stat" proposée ci-dessus, mais que se passe-t-il si j'ai "touché" le répertoire de processus PID hier ? Cela signifie que mon processus vieux d'un an est affiché avec l'horodatage d'hier. Non, ce n'est pas ce dont j'ai besoin :(

Dans les plus récents, c'est simple :

ps -o etimes -p <PID>
ELAPSED
339521

aussi simple que cela. Le temps est présent en secondes. Faites ce dont vous avez besoin. Avec certaines boîtes plus anciennes, la situation est plus difficile, puisqu'il n'y a pas d'etimes. On peut compter sur :

ps -o etime -p <PID>
ELAPSED
76-03:26:15

qui semblent un "peu" bizarres puisqu'elles sont au format dd-hh:mm:ss. Cela ne convient pas pour un calcul ultérieur. J'aurais préféré que ce soit en secondes, d'où l'utilisation de celui-ci :

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544

5voto

BarbaAlGhul Points 93

Une chose aussi simple ne trouve pas de réponse adéquate après 5 ans ?

Je ne pense pas que vous puissiez obtenir précisément des millisecondes. Par exemple, si vous voyez man procfs et voir /proc/$$/stat qui a le champ 22 comme startime, qui est en "ticks d'horloge", vous auriez quelque chose de plus précis, mais les ticks d'horloge ne vont pas à un rythme parfaitement constant (par rapport à "l'heure de l'horloge murale") et seront décalés... le sommeil et certaines choses (ntpd je suppose) le compensent. Par exemple, sur une machine exécutant ntpd, avec 8 jours de fonctionnement et qui n'a jamais dormi, dmesg -T a le même problème (je pense...), et vous pouvez le voir ici :

# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar  3 10:26:17 CET 2017
[Fri Mar  3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) 
Fri Mar  3 10:26:17 CET 2017

Voici les secondes :

# example pid here is just your shell
pid=$$

# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)

# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")

# simple subtraction (both are in UTC, so it works)
age=$((now-start))

printf "that process has run for %s seconds\n" "$age"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X