ottenere il tempo trascorso in bash

Vorrei fare quanto segue a un certo punto in uno script:

start_time=date 

e dopo che uno o più processi sono stati eseguiti:

end_time=date 

e poi:

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

Come potrei farlo?

Commenti

Risposta

Utilizza il tempo trascorso dallepoca per identificare facilmente un periodo di tempo in uno 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 non supporta i numeri in virgola mobile, quindi dovrai usare uno strumento esterno come bc per confrontare tempi come 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 

Commenti

  • ecco cosa Stavo cercando … può includere il microtime?
  • Prova date '+%s.%N'
  • Dovresti chiamare date con date -u per evitare lora legale e problemi locali con il comando. leggi questa risposta
  • Visto che (tradizionalmente) bc è implementato con dc, puoi utilizzare dc direttamente: elapsed=$(dc -e "$end_time $start_time - p")

Risposta

bash ha un variabile timer incorporata

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

Commenti

  • Oppure SECONDS=0; ...; echo "$SECONDS". Attenzione però a quel bug .

Risposta

@jasonwryan lo ha già suggerito, ma lo inserirò come risposta poiché è anche il mio punto di riferimento quando voglio cronometrare uno script. Per cronometrare myscript usa semplicemente:

time myscript 

Commenti

  • Proverò di tanto in tanto ma è più per quando ne ho bisogno isolare o temporizzare le sottosezioni del mio script ..
  • Questo non è utile se vuoi usare il tempo trascorso derivato allinterno dello script stesso, ad esempio per calcolare quante unità lo script è stato in grado di elaborare al secondo .

Risposta

Mi piace la risposta di @Miata perché richiama lattenzione su date +%s soluzione. Tuttavia, @Miata include .%N ma non sono sicuro di quale vantaggio otterrai guardando i nanosecondi quando cè il costo di esecuzione di date comando in una subshell. Quindi, in pratica, date +%s dovrebbe essere sufficiente. Laltra cosa da notare è date +%s lepoca è 1970-01-01 00:00:00 UTC. Il che significa che il tempo ha unepoca assoluta e puoi condividere la misurazione del tempo tra diverse istanze di script di shell o macchine diverse.

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

Mi piace @glenn jackman ” s risposta perché si riferisce alla SECONDS variabile incorporata di bash. La cosa da notare qui è che lepoca è lora in cui il processo è stato avviato. Quindi, possiamo usare questa tecnica solo per misurare i tempi per le cose che accadono allinterno di quello script:

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

Unaltra cosa è che metto tutti i miei compiti allinterno del (( )) comando, cioè puoi riscrivere:

cmd=$(( some_expression )) 

come

(( cmd=some_expression )) 

In questo modo , possiamo ridurre al minimo la presenza del simbolo $.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *