Me gustaría mostrar el tiempo de finalización de un script.
Lo que hago actualmente es
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
Esto solo muestra la hora de inicio y finalización del guión. ¿Sería posible mostrar una salida de grano fino como tiempo de procesador / tiempo io, etc.?
Respuestas:
Solo use
time
cuando llame al script:fuente
real
,user
ysys
. Para el significado de estos, ver aquí .time $( ... ) >> out.txt
time (command1 && command2)
Si
time
no es una opción,fuente
date
por ejemplo, todavía está invocando dos veces, por lo que en el mejor de los casos puede obtener una precisión de milisegundos en la práctica, y probablemente menos), intente usardate +%s.%N
. (%N
son nanosegundos desde todo el segundo.)date +%s%N
, o use algo más capaz comobc
calcular el tiempo de ejecución real a partir de los dos valores como sugiere jwchew. Aún así, siento que este enfoque es una forma subóptima de hacerlo;time
es considerablemente mejor si está disponible, por las razones descritas anteriormente.bc
y luego haga esto:runtime=$( echo "$end - $start" | bc -l )
echo "Duration: $((($(date +%s)-$start)/60)) minutes
Simplemente llame
times
sin argumentos al salir de su script.Con
ksh
ozsh
, también puede usartime
en su lugar. Conzsh
,time
también le dará el tiempo de reloj de pared además del tiempo de CPU del usuario y del sistema .Para preservar el estado de salida de su script, puede hacerlo:
O también puede agregar una trampa en
EXIT
:De esa manera, se llamarán los tiempos cada vez que el shell salga y se conservará el estado de salida.
También tenga en cuenta que todos
bash
,ksh
yzsh
tener una$SECONDS
variable especial que automáticamente se incrementa cada segundo. En amboszsh
yksh93
, esa variable también se puede hacer punto flotante (contypeset -F SECONDS
) para obtener más precisión. Este es solo el tiempo del reloj de pared, no el tiempo de la CPU.fuente
time
enfoque cercano presentado anteriormente. - - Creo que eltimeit
enfoque presentado en el código MATLAB puede ser útil aquí.times
no le da tiempo a la pared, ¿verdad? por ejemplo,bash -c 'trap times EXIT;sleep 2'
Llego un poco tarde al tren, pero quería publicar mi solución (para una precisión de menos de un segundo) en caso de que otros tropiecen con este hilo a través de la búsqueda. La salida está en formato de días, horas, minutos y finalmente segundos:
¡Espero que alguien lo encuentre útil!
fuente
date
no admite precisión por debajo de un segundo y solo agregará literalmente "N
" a la marca de tiempo.dt2=$(echo "$dt%86400" | bc)
. Solo digo ... Por cierto, prefiero la forma,dt2=$(bc <<< "${dt}%86400")
pero eso es completamente personal.Mi método para
bash
:fuente
Sí, esto se llama Python, pero si puedes vivir con eso, entonces esta es una solución bastante agradable y concisa.
fuente
python
comando en una subshell y leer su salida requerirá varios millones de nanosegundos en la mayoría de los sistemas actuales. Lo mismo para correrdate
.Esta pregunta es bastante antigua, pero al tratar de encontrar mi forma favorita de hacerlo, este hilo surgió alto ... y me sorprende que nadie lo haya mencionado:
'perf' es una herramienta de análisis de rendimiento incluida en el núcleo bajo 'tools / perf' y a menudo disponible para instalar como un paquete separado ('perf' en CentOS y 'linux-tools' en Debian / Ubuntu). El Linux Kernal perf Wiki tiene mucha más información al respecto.
Ejecutar 'perf stat' proporciona bastantes detalles, incluido el tiempo de ejecución promedio justo al final:
fuente
perf
?perf stat
ahora se queja de "Es posible que no tenga permiso para recopilar estadísticas". a menos que ejecute algunos comandos consudo
, lo que lo hace inútil en todos los escenarios donde no posee completamente la máquina de destino.Una pequeña función de shell que se puede agregar antes de los comandos para medir su tiempo:
Luego, úselo en su script o en su línea de comando de la siguiente manera:
fuente
s=$(date +%s000)
, no estoy seguro de si funciona.Aquí hay una variación de la respuesta de Alex. Solo me importan los minutos y los segundos, pero también quería que tuviera un formato diferente. Entonces hice esto:
fuente
fuente
date
antes y después del guión y generan la diferencia entre ellas?Usando solo bash también es posible medir y calcular la duración del tiempo para una parte del script de shell (o el tiempo transcurrido para todo el script):
ahora puede imprimir la diferencia:
si solo necesita una duración incremental, haga lo siguiente:
También puede almacenar la duración en una variable:
fuente
Personalmente, me gusta envolver todo mi código de script en alguna función "principal" de esta manera:
Observe lo fácil que es usar el
time
comando en este escenario. Obviamente no estás midiendo el tiempo preciso, incluido el tiempo de análisis del script, pero lo encuentro lo suficientemente preciso en la mayoría de las situaciones.fuente
fuente
La función de temporización basada en
SECONDS
, limitada solo a granularidad de segundo nivel, no utiliza ningún comando externo:Por ejemplo:
da
fuente