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
timecuando llame al script:fuente
real,userysys. Para el significado de estos, ver aquí .time $( ... ) >> out.txttime (command1 && command2)Si
timeno es una opción,fuente
datepor 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. (%Nson nanosegundos desde todo el segundo.)date +%s%N, o use algo más capaz comobccalcular 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;timees considerablemente mejor si está disponible, por las razones descritas anteriormente.bcy luego haga esto:runtime=$( echo "$end - $start" | bc -l )echo "Duration: $((($(date +%s)-$start)/60)) minutesSimplemente llame
timessin argumentos al salir de su script.Con
kshozsh, también puede usartimeen su lugar. Conzsh,timetambié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,kshyzshtener una$SECONDSvariable especial que automáticamente se incrementa cada segundo. En amboszshyksh93, 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
timeenfoque cercano presentado anteriormente. - - Creo que eltimeitenfoque presentado en el código MATLAB puede ser útil aquí.timesno 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
dateno 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
pythoncomando 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 statahora 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
dateantes 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
timecomando 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