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.
Réponses
Trop de publicités?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.
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.
De la page de manuel de time :
- Il peut y avoir un shell appelé appelé time, éviter ceci en spécifiant
/usr/bin/time
-
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
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