Je souhaite savoir combien de temps prend une opération dans un script Linux Shell. Comment puis-je faire ceci?
L'utilisation de la commande time, comme d'autres l'ont suggéré, est une bonne idée.
Une autre option consiste à utiliser la variable intégrée magique $ SECONDS, qui contient le nombre de secondes depuis le début de l'exécution du script. Tu peux dire:
START_TIME=$SECONDS
dosomething
ELAPSED_TIME=$(($SECONDS - $START_TIME))
Je pense que c'est spécifique à bash, mais puisque vous êtes sous Linux, je suppose que vous utilisez bash.
Utilisez la commande time
. time ls /bin
.
Essayez l'exemple suivant:
START_TIME=$SECONDS
# do something
sleep 65
ELAPSED_TIME=$(($SECONDS - $START_TIME))
echo "$(($ELAPSED_TIME/60)) min $(($ELAPSED_TIME%60)) sec"
#> 1 min 5 sec
De nombreuses réponses mentionnent $SECONDS
, mais cette variable est en fait encore mieux qu'on ne le pense :
L'affectation à cette variable réinitialise le nombre à la valeur affectée, et la valeur développée devient la valeur affectée plus le nombre de secondes depuis l'affectation.
Cela signifie que vous pouvez simplement interroger cette variable directement à la fin de votre script pour imprimer le temps écoulé:
#!/usr/bin/env bash
# Do stuff...
echo "Script finished in $SECONDS seconds."
Vous pouvez également chronométrer des sections plus petites comme ceci:
#!/usr/bin/env bash
# Do stuff
SECONDS=0
# Do timed stuff...
echo "Timed stuff finished in $SECONDS seconds."
Voici le script pour trouver le temps écoulé en millisecondes. Remplacez la ligne sleep 60 par le code que vous souhaitez exécuter.
a=0
while [ $a -lt 10 ]
do
START_TIME=`echo $(($(date +%s%N)/1000000))`
sleep 3
END_TIME=`echo $(($(date +%s%N)/1000000))`
ELAPSED_TIME=$(($END_TIME - $START_TIME))
echo $ELAPSED_TIME
if [ $a -eq 10 ]
then
break
fi
a=`expr $a + 1`
done
Juste pour aider quelqu'un comme moi qui reçoit une erreur:
arithmetic expression: expecting primary: "-"
Vérifiez votre shellscript qui commence par:
#!/bin/bash
À votre santé!
GNU time
Je suis également un grand amusement de la commande GNU time
: https://www.gnu.org/software/time/ qui offre quelques options importantes par rapport au time
Bash intégré.
Exemple d'utilisation:
env time --format '%e' --output time.log sleep 1
Sortie:
1.00
Explication:
env
: pour trouver /usr/bin/time
au lieu du Bash intégré
--format '%e'
: temps d'impression en secondes, voir man time
.
C'est souvent ce que je veux lors de l'analyse comparative: un seul numéro plutôt que minutes + secondes.
Et un modèle important que j'utilise souvent est:
bench-cmd() (
logfile=time.log
echo "cmd $@" >> "$logfile"
printf 'time ' >> "$logfile"
bench_cmd="env time --append --format '%e' --output '$logfile' $@"
eval "$bench_cmd"
echo >> "$logfile"
)
rm -f time.log
bench-cmd sleep 1
bench-cmd sleep 2
bench-cmd sleep 3
cat time.log
Sortie:
cmd sleep 1
time 1.00
cmd sleep 2
time 2.00
cmd sleep 3
time 3.00
Explication:
--output
: affiche l'heure dans un fichier.
Par défaut, la sortie va à stderr, donc cette option est importante pour séparer le timing du stderr de la commande.
--append
: ajouter au fichier au lieu de l'écraser.
Cela me permet de concentrer l'ensemble de la sortie de référence dans un seul fichier.