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

88

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"
jack
la source

Réponses:

72

N'oubliez pas qu'il y a une différence entre le builtin de bash time(qui devrait être appelé par défaut lorsque vous le faites time command) et /usr/bin/time(qui devrait vous obliger à l'appeler par son chemin complet).

L'intégré timeimprime toujours sur stderr, mais /usr/bin/timevous permettra d'envoyer la sortie de l'heure à un fichier spécifique, afin de ne pas interférer avec le flux stderr de la commande exécutée. De plus, /usr/bin/timele format de s est configurable sur la ligne de commande ou par la variable d'environnement TIME, alors que le timeformat intégré de bash n'est configuré que par la TIMEFORMATvariable d'environnement.

$ 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
Mark Rushakoff
la source
De man bash: "La variable TIMEFORMAT peut être définie sur une chaîne de format qui spécifie comment les informations de minutage doivent être affichées"
Pause jusqu'à nouvel ordre.
Oups - Je pensais qu'il y avait un moyen de le formater, mais je l'ai manqué help timeparce que je n'ai jeté qu'un coup d'œil dessus et j'ai pensé que c'était un argument de ligne de commande. Je mettrai à jour la réponse.
Mark Rushakoff
2
Nous voici 9 ans plus tard et la commande n'a pris que 0m0.018s. Je pensais juste que je le soulignerais.
Ghassen Louhaichi
112

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

Vous pouvez également 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 en bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
foule
la source
d'accord avec Maaza, cette flexibilité m'a permis de mesurer le temps de tout un ensemble de commandes.
Nath
Est-il possible d'appliquer des aspects Linux autour de n'importe quelle commande linux pour calculer l'exécution
Syed Mazreena
1
Un inconvénient de cette approche est qu'elle mesure en secondes, alors qu'elle timeutilise des millisecondes. Et si vous voulez chronométrer une poignée de commandes ensemble sans avoir à utiliser de variables et de calculs, vous pouvez utiliser des parenthèses: time ( command1 ; command2 ; command3 )vous pouvez même les chronométrer individuellement avec un temps total, comme ceci: time ( time command1 ; time command2 ; time command3 ) Bien sûr, si vous voulez une vingtaine de commandes, vous pouvez mieux vaut utiliser la solution de cette réponse. Mais alors, vous devriez commencer à penser à mettre toutes vos commandes dans un script ...
msb
25
root@hostname:~# time [command]

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

Jason
la source
C'est certainement la réponse de base - mais il y a quelques complications si vous voulez voir la sortie d'erreur de la commande tout en envoyant les informations de synchronisation à la sortie standard comme le fait la question. La commande time écrit dans stderr. Ce que vous suggérez est probablement assez précis - d'où mon +1.
Jonathan Leffler
2
timeécrit sur le tty, pas sur stderr. Ce qui, je suppose, aggrave les choses.
mob
12

Pour une mesure delta ligne par ligne, essayez gnonom .

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

Ajouter 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 pour apparaître. Par défaut, gnomon affichera les secondes écoulées entre chaque ligne, mais cela est configurable.

démo gnomon

Janus Troelsen
la source
8

Ajout à la réponse de @ mob:

L'ajout %Nde date +%snous donne une précision nanoseconde:

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

Si je démarre un processus de longue durée comme une copie ou un hachage et que je veux savoir plus tard combien de temps cela a pris, je fais juste ceci:

$ date; sha1sum reallybigfile.txt; date

Ce qui entraînera la sortie suivante:

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

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

Ethan
la source
4

Dans zsh, vous pouvez utiliser

=time ...

Dans bash ou zsh, vous pouvez utiliser

command time ...

Ceux-ci (par des mécanismes différents) forcent une commande externe à être utilisée.

überRegenbogen
la source
0

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

Alejandro Galera
la source