Forum Programmation.shell Conversion d'heure en bash

Posté par  .
Étiquettes : aucune
0
7
fév.
2006
Salut
Je souhaite récupérer l'"age" d'un process en secondes.
la commande ps -p 6232 -o etime|grep: me renvoie :
SS ou MM:SS ou HH:MM:SS
Me reste à convertir ce résultat en secondes
Mais pour la suite, je sens que je m'embarque dans une usine à gaz :
Mon idée est de faire une recherche de chaine et récupérer HH, MM et SS puis
ma_durée = 3600*HH + 60*MM + SS

Avez vous un truc plus simple et plus propre ?

Merci.

David.
  • # Et les jours aussi

    Posté par  . Évalué à 5.

    Attention : ps est aussi susceptible de renvoyer des jours, si temps > 24H :
    % ps -p 1 -o etime
        ELAPSED
     1-23:54:12
    
    À part ça, ton idée de parsing ne me choque pas outre mesure. Enfin perso, je l'écrirais comme ça aussi je pense. Genre en Bash-3.x :
    #!/bin/bash
    PTIME=$(ps -p ${1} -o etime | tail -n 1)
    if [[ "$PTIME" =~ "(((([0-9]+)-)?([0-9]+):)?([0-9]+):)?([0-9]+)$" ]] ; then
    	DD=${BASH_REMATCH[4]:-0}
    	HH=${BASH_REMATCH[5]:-0}
    	MM=${BASH_REMATCH[6]:-0}
    	SS=${BASH_REMATCH[7]}
    	(( TOTAL = (((DD * 24 + HH) * 60 + MM) * 60) + SS  ))
    	echo "Elapsed seconds for PID ${1}: ${TOTAL}"
    else
    	echo "Erreur !" >&2
    fi
    
    Test :
    % /tmp/ptime 1
    Elapsed seconds for PID 1: 172456
    % /tmp/ptime 4052
    Elapsed seconds for PID 4052: 1292
    
    • [^] # Re: Et les jours aussi

      Posté par  . Évalué à 5.

      Heu, ouais, nan, sinon une autre solution serait peut-être d'aller chercher ça directement dans /proc/${PID}/stat. Hmmm... ouaif, la flemme de lire `man proc` là...
      • [^] # Re: Et les jours aussi

        Posté par  . Évalué à 2.

        suis d'accord
        J'ai fouillé dans /proc, mais j'ai rien trouvé.
        Pourtant, ça doit y être piusque ps en tire ses infos
        Merci.
      • [^] # Re: Et les jours aussi

        Posté par  (site web personnel) . Évalué à 5.

        Le probleme c'est que tu recuperes des jiffies et que je n'ai pas trouvé comment déterminer HZ.

        En supposant que c'est 100 echo $((($(cut -d' ' -f 22 /proc/self/stat)-$(cut -d' ' -f 22 /proc/$PID/stat))/100)) mais bon ca depend de ton kernel :(
        • [^] # Re: Et les jours aussi

          Posté par  . Évalué à 2.

          Je crois comprendre d'un rapide Google que :
          - le HZ du kernel ne se retrouve nulle part dans /proc (des patchs pour l'ajouter sont régulièrement refusés)
          - les jiffies qu'on récupère dans /proc sont convertis pour 100Hz de toute façon, même quand le kernel utilise autre chose

          D'ailleurs, ici (HZ=1000), ton code marche nickel aussi (avec le "100" inchangé).

          Mais peut-être qu'il serait plus prudent d'utiliser quand même $(getconf CLK_TCK) à la place (des fois que sur d'autres archis, ou dans un futur lointain, le «c'est toujours 100» ne soit plus vérifié).
        • [^] # Re: Et les jours aussi

          Posté par  . Évalué à 2.

          <mode_chieur>
          Tiens et par contre t'as un bug si il y a des espaces dans le nom de ton processus :P
          Faudrait plutôt des $(sed 's:.*) ::' /proc/MACHIN/stat | cut -d' ' -f 20)
          </mode_chieur>
    • [^] # Re: Et les jours aussi

      Posté par  . Évalué à 3.

      Bravo
      Je sais pas si je dois le dire
      Allez si..... , je suis là dessus depuis 4h

      Pour ma défense, c'est mon premier script.

      Mais j'ai quand même perdu 4 h.

      Merci.

      David.
      • [^] # Re: Et les jours aussi

        Posté par  . Évalué à 2.

        Je sais pas si je dois le dire
        Allez si..... , je suis là dessus depuis 4h

        Pour ma défense, c'est mon premier script.

        Mais c'est très bien de s'acharner 4 heures sur son premier script. ;-)
        Y'a vraiment aucune honte, je crois qu'on peut difficilement apprendre les ficelles de Bash sans se casser un peu les dents au début. Enfin perso en tout cas, je n'y avais pas échappé.

        Au passage, si jamais y'a des trucs que tu ne comprends pas dans ma solution, et que ça t'intéresse quand même, bah t'hésites pas à demander qlqs explication hein...
    • [^] # Re: Et les jours aussi

      Posté par  . Évalué à 2.

      Erf, j'ai un bug... Bash il n'aime pas le format "0X" pour un entier... Obligé de faire un truc du genre :
      	HH=${BASH_REMATCH[5]#0} ; HH=${HH:-0}
      	MM=${BASH_REMATCH[6]#0} ; MM=${MM:-0}
      	SS=${BASH_REMATCH[7]#0} ; SS=${SS:-0}
      
  • # SECONDS

    Posté par  (site web personnel) . Évalué à 1.

    echo $SECONDS te fournira le nombre de secondes écoulées depuis le début de ton script bash

    donc pour les scripts en bash que tu lances, il t'est possible de connaître leur temps d'exécution, après tu peux l'écrire quelque part...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.