web-dev-qa-db-fra.com

Comment mesurer la durée en secondes dans un script Shell?

Je souhaite savoir combien de temps prend une opération dans un script Linux Shell. Comment puis-je faire ceci?

70
Zubair

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.

103
Tom Anderson

Utilisez la commande time. time ls /bin.

39
Keith

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
34

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."
6
Tammer Saleh

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
5
user3300239

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é!

3
rafa.ferreira

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

GitHub en amont .

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.