Comment puis-je trouver la disponibilité d'un processus Linux donné.
ps aux | grep gedit | grep -v grep
me donne beaucoup d’informations qui incluent l’heure à laquelle le processus a été lancé. Je recherche spécifiquement un commutateur qui renvoie la disponibilité d'un processus en millisecondes.
Merci
Comme "disponibilité" a plusieurs sens, voici une commande utile.
ps -eo pid,comm,lstart,etime,time,args
Cette commande répertorie tous les processus avec plusieurs colonnes temporelles différentes. Il comporte les colonnes suivantes:
PID COMMAND STARTED ELAPSED TIME COMMAND
PID
= ID de processus
first COMMAND
= uniquement le nom de la commande sans options ni argumentsSTARTED
= heure absolue à laquelle le processus a été lancéELAPSED
= temps écoulé depuis le début du processus ( heure de l'horloge murale ), format [[jj-] hh:] mm: ss TIME
= temps UC cumulé, "[jj-] hh: mm : format "ss"
second COMMAND
= à nouveau la commande, cette fois avec toutes les options et les arguments fournis
Si vous avez une version limitée de ps
telle que celle trouvée dans busybox
, vous pouvez obtenir l'heure de début du processus en consultant l'horodatage de /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 comparez-le avec la date actuelle ...
# date
Thu May 22 03:00:47 EDT 2014
Je pense que vous pouvez 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
Une question aussi simple ne répond pas correctement après 5 ans?
Je ne pense pas que vous pouvez obtenir avec précision millisecondes. par exemple. si vous voyez man procfs
et voyez /proc/$$/stat
qui a le champ 22 en tant que startime, qui est en "tick ticks", vous obtiendrez quelque chose de plus précis, mais les ticks d'horloge ne vont pas à une vitesse parfaitement constante et sera éteint ... dormir et certaines choses (ntpd je suppose) le compenser. Par exemple, sur une machine exécutant ntpd, avec 8 jours de disponibilité et n’ayant 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"
oui, trop vieux et pourtant trop dur. J'ai essayé avec la méthode "stat" proposée ci-dessus, mais que se passerait-il si j'avais "touché" le proc PID hier? Cela signifie que mon processus vieux d'un an est montré avec l'horodatage d'hier. Nah, 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 vieilles boîtes, la situation est plus difficile, car il n'y a pas de temps. On pourrait compter sur:
ps -o etime -p <PID>
ELAPSED
76-03:26:15
qui a l’air un peu "bizarre" car il est au format jj-hh: mm: ss. Ne convient pas pour un calcul ultérieur. Je l'aurais préféré en quelques secondes, c'est pourquoi j'ai utilisé 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