J'aimerais utiliser la commande time dans un script bash pour calculer le temps écoulé du script et l'écrire dans un fichier journal. J'ai seulement besoin 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.
Le format attendu est supposé être 00:00:00.0000
_ (millisecondes) [heures]: [minutes]: [secondes]. [millisecondes]
J'ai déjà 3 scripts. J'ai vu un exemple comme celui-ci:
{ time { # section code goes here } } 2> timing.log
Mais 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).
En d'autres termes, j'aimerais savoir comment transformer la sortie de temps en quelque chose de plus facile à traiter.
Vous pouvez utiliser la commande date
pour obtenir l'heure actuelle avant et après l'exécution du travail à chronométrer et calculer la différence de la manière suivante:
#!/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 pas mettez des espaces avant un moins - , car cela pourrait être interprété comme une option de ligne de commande.
Voir aussi: http://tldp.org/LDP/abs/html/arithexp.html
EDIT:
De plus, vous pouvez jeter un oeil à sed pour rechercher et extraire des sous-chaînes de la sortie générée. par temps .
EDIT:
Exemple de minutage avec millisecondes (en réalité nanosecondes, mais tronqué ici en millisecondes). Votre version de date
doit prendre en charge le %N
format et bash
devraient prendre en charge les grands nombres.
# 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 originale disait
M="$((T%1000000000/1000000))"
mais cela a été supprimé parce que cela n'a apparemment pas fonctionné pour certaines personnes alors que la nouvelle version aurait fonctionné. Je n'approuvais pas cela parce que je pense que vous devez utiliser uniquement le reste mais vous avez été mis aux voix.
Choisissez ce qui vous convient.
Depuis le page de manuel pour time :
/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
Pour utiliser le construit Bash time
plutôt que /bin/time
vous pouvez définir cette variable:
TIMEFORMAT='%3R'
qui produira le temps réel qui ressemble à ceci:
5.009
ou
65.233
Le nombre spécifie la précision et peut aller de 0 à 3 (valeur par défaut).
Vous pouvez utiliser:
TIMEFORMAT='%3lR'
pour obtenir une sortie qui ressemble à:
3m10.022s
Le l
(ell) donne un format long.
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:
Start 0
Middle 10
End 20
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