Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/08/2010, à 18:06

Hizoka

[resolu] temps écoulé entre 2 dates

Bonsoir,

je souhaite indiqué le temps qu'à pris une opération dans un script bash,

j'avais pensé à time mais c'est galère car il y a de nombreuses commandes à prendre en compte et des processus d’arrière plan.

j'ai donc pensé à récupérer la date en seconde (date +%s) en début et fin de script et de les soustraire afin d'avoir la durée en seconde.

y a-t-il une meilleur solution sachant que ça ne concerne pas tout le script mais des partie seulement, est-il possible d'utiliser les dates mais avec les minutes et secondes ?

merci

Dernière modification par Hizoka (Le 29/08/2010, à 19:51)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#2 Le 27/08/2010, à 20:25

ehmicky

Re : [resolu] temps écoulé entre 2 dates

Y'aurait des solutions en utilisant les fonctions de time.h, mais une solution en C convient-elle ?
Pour du Bash et commandes Unix, pourquoi time ne convient pas ? En plus, c'est un shell keyword, c'est la seule commande qui traitera bien (contrairement à une commande Unix (comme /usr/bin/time) ou C perso) le temps d'exécution des builtins (du moins c'est ce dont ils se vantent sur la référence de Bash...). Elle me semble la commande la plus précise au niveau de la limitation des I/O de la commande elle-même, faussant le temps d'exécution.
Donc, quel est en fait le problème avec le keyword time ? Si le problème est qu'il faut faire un time sur plusieurs commandes, on peut faire un :

time {
    COMMANDES...
}

S'il y a toutefois un problème, time.h en C permet d'intercepter les signaux de l'horloge, et de faire des conversions de date (par exemple la conversion secondes => HH:MM:ss que je n'ai toujours pas trouvé en commande Unix ! (mais c'est simulable avec une fonction))

Dernière modification par ehmicky (Le 27/08/2010, à 20:26)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#3 Le 27/08/2010, à 22:07

Hizoka

Re : [resolu] temps écoulé entre 2 dates

non, je ne souhaite pas intégrer du c, mais bien resté en bash.

le problème en fait, c'est qu'il y a des appels de fonctions, des lancements de fichiers en tache de fond... et je ne trouva pas ça des plus pratique...

afin de ne pas mourir bête, j'ai quand même essayais et il se trouve que ça ne passe pas...

c'est un logiciel utilisant  bash + interface graphique via glade2script.

merci de ta réponse mais pour le coup je vais rester avec mes secondes smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#4 Le 27/08/2010, à 22:40

Totor

Re : [resolu] temps écoulé entre 2 dates

je pense que c'est assez facile
mais j'ai pas trop le temps ce WE...
si ça peut attendre lundi ...


-- Lucid Lynx --

Hors ligne

#5 Le 27/08/2010, à 23:00

Hizoka

Re : [resolu] temps écoulé entre 2 dates

pas de soucis totor smile

de toute facon je ne suis pas la ce week end tongue


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 28/08/2010, à 11:35

credenhill

Re : [resolu] temps écoulé entre 2 dates

hello
une fonction pour afficher en h:mm:ss le temps utilisé par une ou des commandes

#!/bin/bash

temps() { t=$(($2-$1)) ; printf "%d:%02d:%02d\n" $(($t/3600)) $((($t%3600)/60)) $(($t%60)) ; }

t1=$(date +%s)
commande
t2=$(date +%s)
temps t1 t2

commande
t3=$(date +%s)
temps t2 t3

Hors ligne

#7 Le 28/08/2010, à 15:08

Totor

Re : [resolu] temps écoulé entre 2 dates

une version rapide :

#!/bin/bash

collect()
{
	totalSec=0
	while read
	do
		((totalSec+=REPLY))
	done
	printf "%s%s\n" "$1" $(date -u -d "@${totalSec}" +'%T')
}

myTime()
{
  sec=$(date +'%s')
  eval "$@"
  echo "$(($(date +'%s')-sec))" >&4
}

{ myTime sleep 3;
sleep 1
myTime sleep 10 &
sleep 2
myTime sleep 2
wait
} 4> >(collect "Temps total collecté : ")

le "wait" permet d'avoir la main réellement à la fin du script. Mais le supprimer ne change rien au résultat final.

Dernière modification par Totor (Le 31/08/2010, à 07:10)


-- Lucid Lynx --

Hors ligne

#8 Le 28/08/2010, à 19:40

ehmicky

Re : [resolu] temps écoulé entre 2 dates

Le :

{ echo ... >&4
...
} >4 >(... while read ...)

m'a tué. Trop fort totor ^^

Dernière modification par ehmicky (Le 28/08/2010, à 19:41)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#9 Le 29/08/2010, à 19:04

Hizoka

Re : [resolu] temps écoulé entre 2 dates

tu peux expliquer stp Totor car tes codes sont toujours puissants mais rarement compréhensible du 1er coup tongue

merci credenhill pour ta soluce un chouille plus compréhensible smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#10 Le 29/08/2010, à 19:45

Totor

Re : [resolu] temps écoulé entre 2 dates

Salut,

La fonction collect permet de collecter et de cumuler toutes les durées (exprimées en secondes) reçues dans son flux d'entrée. La collecte se termine une fois la fin du flux atteint. La durée totale est alors convertie en hh:mm:ss. En réalité, il ne s'agit pas d'une conversion mais seulement d'un simple affichage de la date (au format hh:mm:ss) correspondant à epoch + totaleSec secondes écoulées (c'est la notation @<secondes>...--> info date -->  Date input formats::--> Seconds since the Epoch:: ). S'agissant donc d'une date, il ne faut pas que cette durée soit de plus d'une journée. Cela dit, si ça devait t'arriver, il suffit de modifier le format d'affichage de la date (ligne date -u -d "@${totalSec}" +'%T').

la procédure myTime permet de calculer la durée d'exécution (en secondes) d'une ligne d'instruction passée en paramètre. Une fois cette durée calculée, elle écrit l'information dans le fd 4. Toutes les durées sont ensuite renvoyées dans l'entrée standard de la fonction collect grace à la redirection et la subtitution de processus : 4> >(collect)

EDIT : le fd 4 a été choisi pour ne pas utiliser le 1 (sortie standard) et 2 (sortie d'erreur) afin de ne pas collecter les informations des commandes exécutées.

Dernière modification par Totor (Le 29/08/2010, à 19:52)


-- Lucid Lynx --

Hors ligne

#11 Le 29/08/2010, à 19:51

Hizoka

Re : [resolu] temps écoulé entre 2 dates

merci !

resolu smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#12 Le 31/08/2010, à 11:16

Totor

Re : [resolu] temps écoulé entre 2 dates

Une autre version :

#!/bin/bash

collect()
{
    totalSec=0
    while read
    do
        ((totalSec+=REPLY))
    done
    printf "%s%s\n" "$1" $(date -u -d "@${totalSec}" +'%T')
}

myTime()
{
  SECONDS=0
  eval "$@"
  echo "${SECONDS}" >&4
}

{ myTime sleep 3;
sleep 1
myTime sleep 10 &
sleep 2
myTime sleep 2
wait
} 4> >(collect "Temps total collecté : ")

-- Lucid Lynx --

Hors ligne