Medir el tiempo dentro de un script

8

Este hilo muestra cómo medir el tiempo que lleva ejecutar un script. En mi caso, estoy interesado en medir el tiempo entre dos puntos dentro de un guión . Aquí hay un ejemplo de cómo me gustaría usar esto:

start_measuring_time
Line 1
Line 2
..
Line N
stop_measuring_time
show_elapsed_time

Me gustaría que el tiempo mostrado sea legible por humanos (segundos, minutos, horas, días, etc.), si es posible. ¿Alguna idea de como hacer esto?

Amelio Vazquez-Reina
fuente

Respuestas:

7

Puedes usar dateutil:

#!/bin/bash

start_measuring_time() {
  read s1 s2 < <(date +'%s %N')
}

stop_measuring_time() {
  read e1 e2 < <(date +'%s %N')
}

show_elapsed_time() {
  echo "$((e1-s1)) seconds, $((e2-s2)) nanoseconds"
}

start_measuring_time
sleep 2
stop_measuring_time
show_elapsed_time
enzotib
fuente
Esto producirá errores: los tiempos de inicio y finalización deben interpretarse como segundos + nanosegundos juntos , no por separado; de lo contrario, puede obtener cosas como valores negativos.
rozcietrzewiacz
1
Vea mi respuesta a esta pregunta para una forma de resolver esto.
rozcietrzewiacz
Tuve que votar en contra, ya que no es una respuesta completamente correcta, corregir da valores negativos a veces, pero en su pregunta, ¿por qué no está haciendo eco antes Tend-Tstart y después$(
Munish
11

Podrías usar time:

time (
Line 1
Line 2
..
Line N
)

Creo que la salida del tiempo es legible para los humanos tal como es, pero si su script se medirá en días, etc., consulte las man timeopciones de formato para la salida.

precioso
fuente
Gracias @frabjous! Creo que aceptaré la respuesta de @ enzotib porque me permite medir el tiempo en flujos de control generales (es decir, no solo en flujos lineales).
Amelio Vazquez-Reina
1

Muestra para probar timerscript.sh:

#!/bin/bash

#timing in minutes with %m
start=`date +%m`
echo 'Start:' $start
#do something e.g. wait for 1.30 minutes 
sleep 90

`end=`date +%m`
echo 'End: '$end
echo 'runtime: '$runtime
Jorduino
fuente