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
-
/usr/bin/time your_script
… - Relaterat: stackoverflow.com/q/8903239/6843677
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
Svar
bash har en inbyggd timervariabel
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Kommentarer
- Eller
SECONDS=0; ...; echo "$SECONDS"
. Akta dig för det där felet .
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.
date '+%s.%N'
date -u
för att undvika DST och lokala problem med kommandot. Vänligen läs detta svarelapsed=$(dc -e "$end_time $start_time - p")