web-dev-qa-db-fra.com

Imprimer le temps d'exécution d'une commande Shell

Est-il possible d'imprimer le temps d'exécution d'une commande Shell avec la combinaison suivante?

root@hostname:~# "command to execute" && echo "execution time"
72
jack

N'oubliez pas qu'il existe une différence entre time (qui doit être appelé par défaut lorsque vous utilisez time command) et /usr/bin/time (qui devrait vous obliger à l'appeler par son chemin complet).

La variable time intégrée est toujours imprimée sur stderr, mais /usr/bin/time vous permettra d'envoyer la sortie de l'heure vers un fichier spécifique, de sorte que vous n'interfériez pas avec le flux stderr de la commande exécutée. De plus, le format de /usr/bin/time est configurable sur la ligne de commande ou à l'aide de la variable d'environnement TIME, alors que le format time de bash est uniquement configuré par la variable d'environnement TIMEFORMAT.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
63
Mark Rushakoff

time est une commande intégrée à la plupart des shells qui écrit des informations de temps d'exécution sur le terminal. 

Vous pouvez aussi essayer quelque chose comme

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

Ou dans bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
96
mob
root@hostname:~# time [command]

Il fait également la distinction entre le temps réel utilisé et le temps système utilisé.

23
Jason

Pour une mesure delta ligne par ligne, essayez gnonom .

C'est un utilitaire de ligne de commande, un peu comme ts de moreutils, pour ajouter des informations d'horodatage à la sortie standard d'une autre commande. Utile pour les processus de longue durée pour lesquels vous souhaitez un enregistrement historique de ce qui prend si longtemps.

Piping quoi que ce soit à gnomon ajoutera un horodatage à chaque ligne, indiquant combien de temps cette ligne était la dernière ligne du tampon - c'est-à-dire combien de temps il a fallu à la ligne suivante. Par défaut, gnomon affichera les secondes écoulées entre chaque ligne, mais cela est configurable.

 gnomon demo

10
Janus Troelsen

Ajout à la réponse de @ mob:

Ajouter %N à date +%s nous donne une précision à la nanoseconde:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`
7
nav

Si je commence un processus long comme une copie ou un hachage et que je veux savoir plus tard combien de temps cela a pris, je fais simplement ceci:

$ date; sha1sum reallybigfile.txt; date

Ce qui donnera le résultat suivant:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

Certes, tel qu'il est mis en œuvre ici, il n'est pas très précis et ne calcule pas le temps écoulé. Mais c'est simple et parfois tout ce dont vous avez besoin.

4
Ethan

En zsh, vous pouvez utiliser

=time ...

En bash ou zsh, vous pouvez utiliser

command time ...

Ceux-ci (par différents mécanismes) forcent l'utilisation d'une commande externe.

3
überRegenbogen

Juste ps -o etime= -p "<your_process_pid>"

0
mulg0r