obtener el tiempo transcurrido en bash

Me gustaría hacer lo siguiente en un punto de un script:

start_time=date 

y esto después de que se haya ejecutado un proceso o procesos:

end_time=date 

y luego haga esto:

elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process" 

¿Cómo haría esto?

Comentarios

Responder

Utilice el tiempo desde época para identificar fácilmente un lapso de tiempo en un script

man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999) 

.

start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process 

Bash no admite números de punto flotante, por lo que necesitará usar una herramienta externa como bc para comparar tiempos como 1475705058.042270582-1475705053.040524971

start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process 

Comentarios

  • esto es lo que Estaba buscando … ¿puede esto incluir el microtiempo?
  • Pruebe date '+%s.%N'
  • Debe llamar a la fecha con date -u para evitar el horario de verano y problemas locales con el comando. lea esta respuesta
  • Al ver cómo (tradicionalmente) se implementa bc con dc, puede usar dc directamente: elapsed=$(dc -e "$end_time $start_time - p")

Respuesta

bash tiene un variable de temporizador incorporada

start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete" 

Comentarios

  • O SECONDS=0; ...; echo "$SECONDS". Sin embargo, tenga cuidado con ese error .

Respuesta

@jasonwryan ya lo sugirió, pero lo incluiré como respuesta, ya que también es mi opción cuando quiero cronometrar un script. Para cronometrar myscript simplemente use:

time myscript 

Comentarios

  • Intentaré esto de vez en cuando, pero esto es más para cuando necesito aislar o cronometrar subsecciones de mi secuencia de comandos.
  • Esto no es útil si desea utilizar el tiempo transcurrido derivado dentro de la secuencia de comandos en sí, por ejemplo, para calcular cuántas unidades pudo procesar la secuencia de comandos por segundo .

Respuesta

Me gusta la respuesta de @Miata porque llama la atención sobre date +%s solución. Sin embargo, @Miata incluye .%N pero no estoy seguro de qué beneficio obtendrás con los nanosegundos cuando existe el costo de ejecutar el date comando en un subshell. Entonces, en la práctica, date +%s debería ser suficiente. La otra cosa a tener en cuenta es date +%s la época es 1970-01-01 00:00:00 UTC. Lo que significa que el tiempo tiene una época absoluta y puede compartir la medición del tiempo entre diferentes instancias de script de shell o diferentes máquinas.

(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24 

Me gusta @glenn jackman » s respuesta porque se refiere a SECONDS variable incorporada bash. Lo que hay que tener en cuenta aquí es que la época es el momento en que se inició el proceso. Por lo tanto, solo podemos usar esta técnica para medir los tiempos de las cosas que suceden dentro de ese script:

(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24 

Otra cosa es que coloco todas mis asignaciones dentro de la (( )) comando. es decir, puede reescribir:

cmd=$(( some_expression )) 

como

(( cmd=some_expression )) 

Al hacer esto , podemos minimizar la aparición del símbolo $.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *