obtenir le temps écoulé en bash

Je voudrais faire ce qui suit à un moment donné dans un script:

start_time=date 

et ceci après lexécution dun ou plusieurs processus:

end_time=date 

et ensuite faire ceci:

elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process" 

Comment puis-je procéder?

Commentaires

Réponse

Utilisez le temps écoulé depuis lépoque pour identifier facilement une période dans un script

man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999) 

.

start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process 

Bash ne prend pas en charge les nombres à virgule flottante, vous devrez donc utiliser un outil externe comme bc pour comparer des temps comme 1475705058.042270582-1475705053.040524971

start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process 

Commentaires

  • voici ce que Je cherchais … cela peut-il inclure du microtime?
  • Essayez date '+%s.%N'
  • Vous devez appeler date avec date -u pour éviter lheure dété et les problèmes locaux avec la commande. Veuillez lire cette réponse
  • Vu comment (traditionnellement) bc est implémenté avec dc, vous pouvez utiliser dc directement: elapsed=$(dc -e "$end_time $start_time - p")

Réponse

bash a un variable de minuterie intégrée

start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete" 

Commentaires

  • Ou SECONDS=0; ...; echo "$SECONDS". Attention cependant à ce bogue .

Réponse

@jasonwryan la déjà suggéré, mais je vais le donner comme réponse car cest aussi mon choix lorsque je veux chronométrer un script. Pour chronométrer myscript , utilisez simplement:

time myscript 

Commentaires

  • Jessaierai ceci de temps en temps mais cest plus pour quand jai besoin de isoler ou chronométrer les sous-sections de mon script.
  • Ce nest pas utile si vous souhaitez utiliser le temps écoulé dérivé dans le script lui-même, par exemple pour calculer le nombre dunités que le script a pu traiter par seconde .

Réponse

Jaime la réponse de @Miata « car elle attire lattention sur date +%s solution. Cependant, @Miata inclut .%N mais je ne sais pas quel avantage vous obtiendrez en regardant les nanosecondes quand il y a le coût de lexécution de date commande dans un sous-shell. Ainsi, en pratique, date +%s devrait être suffisant. Lautre chose à noter est que date +%s est 1970-01-01 00:00:00 UTC. Ce qui signifie que le temps a une époque absolue et que vous pouvez partager la mesure du temps entre différentes instances de script shell ou différentes machines.

(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24 

Jaime @glenn jackman  » car elle fait référence à la variable intégrée SECONDS bash. La chose à noter ici est lépoque à laquelle le processus a été lancé. Nous ne pouvons donc utiliser cette technique que pour mesurer les temps pour les choses qui se produisent dans ce script:

(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24 

Une autre chose est que je place toutes mes affectations dans le (( )) commande. cest-à-dire que vous pouvez réécrire:

cmd=$(( some_expression )) 

comme

(( cmd=some_expression )) 

En faisant cela , nous pouvons minimiser loccurrence du symbole $.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *