få forløbet tid i bash

Jeg vil gerne gøre følgende på et tidspunkt i et script:

start_time=date 

og dette, efter at en proces eller processer er kørt:

end_time=date 

og derefter gøre dette:

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

Hvordan ville jeg gøre dette?

Kommentarer

Svar

Brug tiden siden epoke til let at identificere et tidsrum i et 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 understøtter ikke flydende numre, så du bliver nødt til at bruge et eksternt værktøj som bc til at 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 hvad Jeg ledte efter .. kan dette omfatte mikrotid?
  • Prøv date '+%s.%N'
  • Du skal ringe til dato med date -u for at undgå sommertid og lokale problemer med kommandoen. Venligst læs dette svar
  • Når du ser, hvordan (traditionelt) bc implementeres med dc, kan du bruge dc direkte: elapsed=$(dc -e "$end_time $start_time - p")

Svar

bash har en indbygget timervariabel

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

Kommentarer

  • Eller SECONDS=0; ...; echo "$SECONDS". Pas dog på den fejl .

Svar

@jasonwryan foreslog det allerede, men jeg smider det som et svar, da det også er min go-to, når jeg vil time et script. Til tid myscript skal du blot bruge:

time myscript 

Kommentarer

  • Jeg vil prøve dette fra tid til anden, men dette er mere når jeg har brug for det isoler eller tidsunderafsnit i mit script ..
  • Dette er ikke nyttigt, hvis du vil bruge den afledte forløbne tid i selve scriptet, f.eks. til at beregne, hvor mange enheder scriptet kunne behandle pr. sekund .

Svar

Jeg kan godt lide @Miatas svar, fordi det henleder opmærksomheden på date +%s løsning. Dog inkluderer @Miata .%N, men jeg er ikke sikker på, hvilken fordel du får ved at se på nanosekunder, når omkostningerne ved at udføre date kommando i en subshell. Så i praksis bør date +%s være tilstrækkelig. Den anden ting at bemærke er date +%s epoke er 1970-01-01 00:00:00 UTC. Hvilket betyder, at tiden har en absolut epoke, og du kan dele tidsmålingen mellem forskellige forekomster af shell-script eller forskellige maskiner.

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

Jeg kan godt lide @glenn jackman ” s svar, fordi det refererer til SECONDS bash indbygget variabel. Det, der skal bemærkes her, er epoken er det tidspunkt, hvor processen blev startet. Så vi kan kun bruge denne teknik til måle tider for ting, der sker inden for dette script:

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

En anden ting er, at jeg lægger alle mine opgaver inden for (( )) kommando, dvs. du kan omskrive:

cmd=$(( some_expression )) 

som

(( cmd=some_expression )) 

Ved at gøre dette , kan vi minimere forekomsten af $ symbolet.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *