Je voudrais afficher le temps d'achèvement d'un script.
Ce que je fais actuellement c'est -
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
Cela montre simplement l'heure du début et de la fin du script. Serait-il possible d'afficher une sortie à granularité fine telle que temps processeur / temps io, etc.?
Réponses:
Il suffit d'utiliser
time
lorsque vous appelez le script:la source
real
,user
etsys
. Pour la signification de ceux-ci, voir ici .time $( ... ) >> out.txt
time (command1 && command2)
Si ce
time
n'est pas une option,la source
date
deux fois, par exemple, afin d' obtenir au mieux une précision de l'ordre de la milliseconde et probablement moins), essayez d'utiliserdate +%s.%N
. (%N
est en nanosecondes depuis la seconde entière.)date +%s%N
, ou utilisez quelque chose de plus capable commebc
de calculer le temps d'exécution réel à partir des deux valeurs suggérées par jwchew. Néanmoins, j'estime que cette approche est une manière sous-optimale de le faire;time
est considérablement meilleur si disponible, pour les raisons exposées ci-dessus.bc
, puis de faire ceci:runtime=$( echo "$end - $start" | bc -l )
echo "Duration: $((($(date +%s)-$start)/60)) minutes
Appelez simplement
times
sans argument lorsque vous quittez votre script.Avec
ksh
ouzsh
, vous pouvez également utiliser à latime
place. Aveczsh
, voustime
obtiendrez également le temps de l'horloge murale en plus du temps de l' utilisateur et du temps système .Pour conserver le statut de sortie de votre script, vous pouvez le faire:
Ou vous pouvez également ajouter un piège sur
EXIT
:De cette façon, les heures seront appelées à chaque fois que le shell se fermera et le statut de sortie sera préservé.
Notez également que tous
bash
,ksh
etzsh
une$SECONDS
variable spéciale qui obtient automatiquement incrémenté à chaque seconde. Dans les deux caszsh
etksh93
, cette variable peut également être faite à virgule flottante (avectypeset -F SECONDS
) pour obtenir plus de précision. Ce n'est que l'heure du mur, pas le temps du processeur.la source
time
approche présentée plus tôt. - - Je pense que l'timeit
approche présentée dans le code MATLAB peut être utile ici.times
ne donne pas le temps de mur, non? par exemple,bash -c 'trap times EXIT;sleep 2'
Je suis un peu en retard, mais je voulais poster ma solution (pour une précision inférieure à la seconde) au cas où d’autres tomberaient sur ce fil en cherchant. La sortie est au format jours, heures, minutes et enfin secondes:
J'espère que quelqu'un trouve cela utile!
la source
date
ne supporte pas la précision inférieure à la seconde et ne fera qu'ajouter un “N
” littéral à l'horodatage.dt2=$(echo "$dt%86400" | bc)
. Juste en disant ... BTW je préfère la formedt2=$(bc <<< "${dt}%86400")
mais c'est tout à fait personnel.Ma méthode pour
bash
:la source
Oui, cela s'appelle Python, mais si vous pouvez vivre avec cela, alors c'est une solution plutôt agréable et laconique.
la source
python
commande dans un sous-shell et la lecture de sa sortie prendront plusieurs millions de nanosecondes sur la plupart des systèmes actuels. Pareil pour courirdate
.Cette question est assez ancienne, mais en essayant de trouver ma façon préférée de le faire, ce fil est arrivé très haut ... et je suis étonné que personne ne l'ait mentionné:
'perf' est un outil d'analyse des performances inclus dans le noyau sous 'tools / perf' et souvent disponible pour l'installation en tant que paquet séparé ('perf' dans CentOS et 'linux-tools' dans Debian / Ubuntu). Le Linux Wiki perf Wiki contient beaucoup plus d’informations à ce sujet.
Lancer 'perf stat' donne pas mal de détails, y compris le temps d'exécution moyen à la fin:
la source
perf
?perf stat
se plaint maintenant de "Vous pouvez ne pas avoir la permission de collecter des statistiques." sauf si vous exécutez certaines commandes avecsudo
, ce qui le rend inutilisable dans tous les scénarios où vous ne possédez pas complètement la machine cible.Une petite fonction shell qui peut être ajoutée avant les commandes pour mesurer leur temps:
Ensuite, utilisez-le dans votre script ou sur votre ligne de commande comme suit:
la source
s=$(date +%s000)
, sans savoir si cela fonctionne.Voici une variante de la réponse d'Alex. Je ne me soucie que des minutes et des secondes, mais je voulais aussi que le formatage soit différent. Alors j'ai fait ça:
la source
la source
date
avant et après le script et affichent la différence entre elles?Personnellement, j'aime bien insérer tout mon code de script dans une fonction "principale" comme ceci:
Notez à quel point il est facile d’utiliser la
time
commande dans ce scénario. Évidemment, vous ne mesurez pas l'heure précise, y compris la durée d'analyse du script, mais je la trouve suffisamment précise dans la plupart des situations.la source
En utilisant uniquement bash, il est également possible de mesurer et de calculer la durée d'une partie du script shell (ou le temps écoulé pour l'ensemble du script):
vous pouvez maintenant soit simplement imprimer la différence:
si vous n’avez besoin que d’une durée supplémentaire, faites:
Vous pouvez également stocker la durée dans une variable:
la source
la source
La fonction de minutage basée sur
SECONDS
, limitée à la granularité de second niveau, n’utilise aucune commande externe:Par exemple:
donne
la source