Imprimir el tiempo de ejecución de un comando de shell

88

¿Es posible imprimir el tiempo de ejecución de un comando de shell con la siguiente combinación?

root@hostname:~# "command to execute" && echo "execution time"
Jack
fuente

Respuestas:

72

No olvide que hay una diferencia entre el builtin de bash time(que debería llamarse por defecto cuando lo hace time command) y /usr/bin/time(que debería requerir que lo llame por su ruta completa).

La función incorporada timesiempre se imprime en stderr, pero /usr/bin/timele permitirá enviar la salida de tiempo a un archivo específico, para que no interfiera con el flujo stderr del comando ejecutado. Además, /usr/bin/timeel formato de 'se puede configurar en la línea de comandos o mediante la variable de entorno TIME, mientras que el timeformato integrado de bash solo se configura mediante la TIMEFORMATvariable de entorno.

$ 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
fuente
De man bash: "La variable TIMEFORMAT puede establecerse en una cadena de formato que especifica cómo se debe mostrar la información de tiempo"
Pausado hasta nuevo aviso.
Vaya, pensé que había alguna forma de formatearlo, pero me lo perdí help timeporque solo lo miré y pensé que era un argumento de línea de comando. Actualizaré la respuesta.
Mark Rushakoff
2
Aquí estamos 9 años después y el comando solo tomó 0m0.018s. Solo pensé en señalar eso.
Ghassen Louhaichi
112

time es un comando integrado en la mayoría de los shells que escribe información sobre el tiempo de ejecución en el tty.

También puedes probar algo como

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

O en bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
multitud
fuente
De acuerdo con Maaza, esta flexibilidad me permitió medir el tiempo de todo un conjunto de comandos.
Nath
¿Es posible aplicar aspectos de Linux alrededor de cualquier comando de Linux para calcular la ejecución?
Syed Mazreena
1
Una desventaja de este enfoque es que mide en segundos, mientras que timeusa milisegundos. Y si desea cronometrar un puñado de comandos juntos sin tener que usar variables y cálculos, puede usar paréntesis: time ( command1 ; command2 ; command3 )incluso puede cronometrarlos individualmente junto con un tiempo total, así: time ( time command1 ; time command2 ; time command3 ) Por supuesto, si desea unos veinte comandos, podría Sería mejor usar la solución de esta respuesta. Pero luego, debería comenzar a pensar en poner todos sus comandos en un script ...
msb
25
root@hostname:~# time [command]

También distingue entre el tiempo real utilizado y el tiempo del sistema utilizado.

Jason
fuente
Esa es ciertamente la respuesta básica, pero existen algunas complicaciones si desea ver el resultado de error del comando y, sin embargo, enviar la información de tiempo a la salida estándar como lo hace la pregunta. El comando time escribe en stderr. Lo que sugieres es probablemente lo suficientemente preciso, de ahí mi +1.
Jonathan Leffler
2
timeescribe en tty, no stderr. Lo que supongo que empeora las cosas.
mafia
12

Para una medición delta línea por línea, pruebe gnonom .

Es una utilidad de línea de comandos, un poco como ts de moreutils, para anteponer la información de la marca de tiempo a la salida estándar de otro comando. Útil para procesos de larga ejecución en los que le gustaría tener un registro histórico de lo que está tardando tanto.

La canalización de cualquier cosa a gnomon antepondrá una marca de tiempo a cada línea, indicando cuánto tiempo fue esa línea la última línea en el búfer, es decir, cuánto tiempo tardó en aparecer la siguiente línea. Por defecto, gnomon mostrará los segundos transcurridos entre cada línea, pero eso es configurable.

demo de gnomon

Janus Troelsen
fuente
8

Agregando a la respuesta de @ mob:

Agregar %Na date +%snos da una precisión de nanosegundos:

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

Si estoy iniciando un proceso de larga duración como una copia o un hash y quiero saber más tarde cuánto tiempo tomó, simplemente hago esto:

$ date; sha1sum reallybigfile.txt; date

Lo que dará como resultado la siguiente salida:

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

Por supuesto, tal como se implementa aquí, no es muy preciso y no calcula el tiempo transcurrido. Pero es muy simple y, a veces, todo lo que necesitas.

Ethan
fuente
4

En zsh puedes usar

=time ...

En bash o zsh puedes usar

command time ...

Estos (por diferentes mecanismos) obligan a utilizar un comando externo.

überRegenbogen
fuente
0

Sólo ps -o etime= -p "<your_process_pid>"

Alejandro Galera
fuente