81 votes

Utilisation de la commande time dans le script bash

J'aimerais utiliser la commande time dans un script bash pour calculer le temps écoulé du script et l'écrire dans un fichier journal. Je n'ai besoin que du temps réel , pas de l'utilisateur et du système. J'en ai aussi besoin dans un format décent. par exemple 00: 00: 00: 00 (pas comme la sortie standard). J'apprécie n'importe quel conseil.

93voto

Archimedix Points 3595

Vous pouvez utiliser l' date de commande pour obtenir l'heure actuelle, avant et après la réalisation de l'œuvre à être chronométré et calculer la différence comme ceci:

#!/bin/bash

# Get time as a UNIX timestamp (seconds elapsed since Jan 1, 1970 0:00 UTC)
T="$(date +%s)"

# Do some work here
sleep 2

T="$(($(date +%s)-T))"
echo "Time in seconds: ${T}"

printf "Pretty format: %02d:%02d:%02d:%02d\n" "$((T/86400))" "$((T/3600%24))" "$((T/60%60))" "$((T%60))""

Notes: $((...)) peut être utilisé pour l'arithmétique de base dans bash – attention: ne mettez pas d'espaces avant un moins - que cela pourrait être interprété comme une option de ligne de commande.

Voir aussi: http://tldp.org/LDP/abs/html/arithexp.html

EDIT:
En outre, vous voudrez peut-être prendre un coup d'oeil à sed de rechercher et d'extraire des sous-chaînes de la sortie générée par le temps.

EDIT:

Exemple pour la synchronisation avec des millisecondes (en fait nanosecondes, mais tronquée de millisecondes ici). Votre version de date a à l'appui de l' %N format et bash devrait soutenir un grand nombre.

# UNIX timestamp concatenated with nanoseconds
T="$(date +%s%N)"

# Do some work here
sleep 2

# Time interval in nanoseconds
T="$(($(date +%s%N)-T))"
# Seconds
S="$((T/1000000000))"
# Milliseconds
M="$((T/1000000))"

echo "Time in nanoseconds: ${T}"
printf "Pretty format: %02d:%02d:%02d:%02d.%03d\n" "$((S/86400))" "$((S/3600%24))" "$((S/60%60))" "$((S%60))" "${M}"

AVERTISSEMENT:
Ma version d'origine a dit

M="$((T%1000000000/1000000))"

mais ceci a été édité en sortir, car il ne semble pas fonctionner pour certaines personnes alors que la nouvelle version semble-t-il. Je n'approuve pas cela parce que je pense que vous devez utiliser le reste mais a été mis en minorité.
Choisissez ce qui vous convient.

65voto

Dennis Williamson Points 105818

Pour utiliser le Bash builtin time plutôt que d' /bin/time vous pouvez définir cette variable:

TIMEFORMAT='%3R'

qui sera de sortie le temps réel qui ressemble à ceci:

5.009

ou

65.233

Le nombre indique la précision et peut varier de 0 à 3 (par défaut).

Vous pouvez utiliser:

TIMEFORMAT='%3lR'

pour obtenir une sortie qui ressemble à ceci:

3m10.022s

L' l (apl) donne un format long.

54voto

Spaceghost Points 2224

De la page de manuel de time :

  1. Il peut y avoir un shell appelé appelé time, éviter ceci en spécifiant /usr/bin/time
  2. Vous pouvez fournir une chaîne de format et l'une des options de format est le temps écoulé - par exemple %E

    /usr/bin/time -f'%E' $CMD

Exemple:

 $ /usr/bin/time -f'%E' ls /tmp/mako/
res.py  res.pyc
0:00.01
 

32voto

Ed Lucero Points 211

Utilisez la variable intégrée bash SECONDS. Chaque fois que vous référencez la variable, elle renverra le temps écoulé depuis l'appel du script.

Exemple:

 echo "Start $SECONDS"

sleep 10

echo "Middle $SECONDS"

sleep 10

echo "End $SECONDS"
 

Sortie: Début 0 Milieu 10 Fin 20

3voto

Amoss Points 1544

Pas tout à fait sûr de ce que vous demandez, avez-vous essayé:

 time yourscript | tail -n1 >log
 

Edit: ok, donc vous savez comment obtenir le temps imparti et vous voulez juste changer le format. Cela vous aiderait si vous décriviez le format que vous voulez, mais voici quelques choses à essayer:

 time -p script
 

Cela modifie la sortie à une fois par ligne en secondes avec des décimales. Vous voulez seulement le temps réel, pas les deux autres, donc pour obtenir le nombre de secondes, utilisez:

 time -p script | tail -n 3 | head -n 1
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X