få forløpt tid i bash

Jeg vil gjerne gjøre følgende på et tidspunkt i et skript:

start_time=date 

og dette etter at en prosess eller prosesser har kjørt:

end_time=date 

og gjør dette:

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

Hvordan ville jeg gjort dette?

Kommentarer

Svar

Bruk tiden siden epoken til å enkelt identifisere et tidsrom i et skript

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 støtter ikke flytende tall, så du må bruke et eksternt verktøy som bc for å sammenligne tider som 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 

Kommentarer

  • dette er hva Jeg lette etter .. kan dette inkludere mikrotid?
  • Prøv date '+%s.%N'
  • Du bør ringe dato med date -u for å unngå sommertid og lokale problemer med kommandoen. Vennligst les dette svaret
  • Ettersom (tradisjonelt) bc implementeres med dc, kan du bruke dc direkte: elapsed=$(dc -e "$end_time $start_time - p")

Svar

bash har en innebygd timervariabel

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

Kommentarer

  • Eller SECONDS=0; ...; echo "$SECONDS". Vær oppmerksom på den feilen .

Svar

@jasonwryan foreslo det allerede, men jeg vil kaste det inn som et svar, da det også er mitt valg når jeg vil time et skript. For å tid myscript bruk bare:

time myscript 

Kommentarer

  • Jeg vil prøve dette innimellom, men dette er mer når jeg trenger isoler eller tidsdeler av skriptet mitt.
  • Dette er ikke nyttig hvis du vil bruke den avledede forløpte tiden i selve skriptet, f.eks. for å beregne hvor mange enheter skriptet kunne behandle per sekund .

Svar

Jeg liker svaret på @Miata fordi det gjør oppmerksom på date +%s løsning. Imidlertid inkluderer @Miata .%N, men jeg er ikke sikker på hvilken fordel du vil se på nanosekunder når det koster å utføre date kommando i en subshell. Så i praksis bør date +%s være tilstrekkelig. Den andre tingen å merke seg er date +%s epoken er 1970-01-01 00:00:00 UTC. Noe som betyr at tiden har en absolutt epoke, og at du kan dele tidsmålingen mellom forskjellige forekomster av skallskript eller forskjellige maskiner.

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

Jeg liker @glenn jackman » s svar fordi det refererer til SECONDS bash innebygd variabel. Tingen å merke seg her er epoken er tiden da prosessen ble startet. Så, vi kan bare bruke denne teknikken til å måle tider for ting som skjer i det skriptet:

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

En annen ting er at jeg legger alle oppgavene mine i (( )) kommando. dvs. du kan skrive om:

cmd=$(( some_expression )) 

som

(( cmd=some_expression )) 

Ved å gjøre dette , kan vi minimere forekomsten av $ -symbolet.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *