Comment trouver la disponibilité d'un processus Linux

69

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

Mahadevan Sreenivasan
la source

Réponses:

113

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 en
premier COMMAND= uniquement le nom de la commande sans options ni arguments
STARTED= l'heure absolue de démarrage du processus
ELAPSED= temps écoulé depuis le démarrage du processus ( heure de l'horloge murale ), format [[jj-] hh:] mm: ss TIME= cumulatif Temps de calcul, "[jj-] hh: mm: ss"
seconde COMMAND= à nouveau la commande, cette fois avec toutes les options et les arguments fournis

Abdull
la source
1
Agréable. Je etimesme préfère moi-même - le temps passé, en secondes - est donc lisible par machine
Asfand Qazi
1
la question portait sur l'heure des statistiques en millisecondes
yohann.martineau
Malheureusement, busybox 1.29.3 a cassé la mise en forme pour etime, ne vous fiez donc pas à elle pour l'analyse.
Danny Dulai
10

Si vous avez une version limitée de pstelle 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
goertzenator
la source
1
Cela semble ne plus fonctionner avec les noyaux actuels.
Goertzenator
7

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
yohann.martineau
la source
4

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 procfset voyez /proc/$$/statquel champ a le champ 22 comme heure de début, qui se trouve dans "ticks d'horloge", vous obtiendrez quelque chose de plus précis, mais les ticks d'horloge ne vont pas à une vitesse parfaitement constante (par rapport au "temps de l'horloge murale") et être en train de dormir et certaines choses (ntpd je suppose) le compensent. Par exemple, sur une machine exécutant ntpd, avec 8 jours de disponibilité et n’ayant jamais dormi, dmesg -Ta 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"
Peter
la source
3

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
George Ivanov
la source
C'est une très bonne façon de le faire sur les anciens systèmes, merci :)
RobotJohnny
ne pas analyser la sortie de etime car busybox 1.29.3 a changé le format. utilisez plutôt la méthode stat + / proc
Danny Dulai
-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => identifiant du processus java

etimes= => temps en secondes et '=' consiste à supprimer l'en-tête

Rohit
la source