få förfluten tid i bash

Jag skulle vilja göra följande vid ett tillfälle i ett skript:

start_time=date 

och detta efter att en process eller processer har körts:

end_time=date 

och gör sedan detta:

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

Hur skulle jag göra det?

Kommentarer

Svar

Använd tiden sedan epoken för att enkelt identifiera en tidsperiod i ett 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öder inte flyttal, så du måste använda ett externt verktyg som bc för att jämföra 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

  • det här är vad Jag letade efter .. kan detta inkludera mikrotid?
  • Prova date '+%s.%N'
  • Du bör ringa datum med date -u för att undvika DST och lokala problem med kommandot. Vänligen läs detta svar
  • Eftersom (traditionellt) bc implementeras med dc kan du använda dc direkt: elapsed=$(dc -e "$end_time $start_time - p")

Svar

bash har en inbyggd timervariabel

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

Kommentarer

Svara

@jasonwryan har redan föreslagit det, men jag kommer att slänga det som ett svar eftersom det också är mitt tillfälle när jag vill tidsinställa ett skript. För att tid mitt skript använd bara:

time myscript 

Kommentarer

  • Jag ska försöka detta då och då men det här är mer för när jag behöver isolera eller tidsavsnitt för mitt skript ..
  • Detta är inte användbart om du vill använda den härledda förflutna tiden i själva skriptet, t.ex. för att beräkna hur många enheter skriptet kunde bearbeta per sekund .

Svar

Jag gillar @Miatas svar eftersom det uppmärksammar date +%s lösning. Emellertid inkluderar @Miata .%N men jag är inte säker på vilken fördel du får när du tittar på nanosekunder när det kostar att köra date kommando i en subshell. Så i praktiken bör date +%s vara tillräckligt. Den andra saken att notera är date +%s epoken är 1970-01-01 00:00:00 UTC. Vilket innebär att tiden har en absolut epok och du kan dela tidsmätningen mellan olika instanser av skalskript eller olika maskiner.

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

Jag gillar @glenn jackman ” s svar eftersom det hänvisar till SECONDS bash inbyggd variabel. Saken att notera här är att epoken är den tid då processen startades. Så, vi kan bara använda denna teknik för att mäta tider för saker som händer i det skriptet:

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

En annan sak är att jag lägger alla mina uppgifter inom (( )) kommando. dvs du kan skriva om:

cmd=$(( some_expression )) 

som

(( cmd=some_expression )) 

Genom att göra detta kan vi minimera förekomsten av $ -symbolen.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *