web-dev-qa-db-fra.com

Comment trouver la disponibilité d'un processus Linux

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

66

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 arguments
STARTED = 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

110
Abdull

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
9
goertzenator

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
6
yohann.martineau

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"
4
Peter

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
3
George Ivanov