Haluan tehdä seuraavat komentosarjan yhdessä kohdassa:
start_time=date
ja tämä prosessin tai prosessien jälkeen:
end_time=date
ja tee sitten tämä:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Kuinka tekisin tämän?
Kommentit
-
/usr/bin/time your_script
… - Liittyvät: stackoverflow.com/q/8903239/6843677
Vastaa
Käytä aikakauden jälkeen tunnistaaksesi helposti aikavälin komentosarjassa
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 ei tue liukulukujen numeroita, joten sinun on käytettävä ulkoista työkalua kuten bc vertaamaan aikoja kuten 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
Kommentit
vastaus
bashilla on sisäänrakennettu ajastinmuuttuja
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Kommentit
- Tai
SECONDS=0; ...; echo "$SECONDS"
. Varo kuitenkin tätä virhettä .
Vastaa
@jasonwryan ehdotti sitä jo, mutta minä heitän sen vastauksena, koska se on myös minun valintani, kun haluan ajoittaa komentosarjan. Aikaa myscript käyttää yksinkertaisesti seuraavasti:
time myscript
Kommentit
- Yritän ajoittain, mutta tämä on enemmän silloin, kun minun on eristä tai skriptiäni osa-alueet.
- Tämä ei ole hyödyllinen, jos haluat käyttää johdettua kulunutta aikaa itse komentosarjassa, esimerkiksi laskeaksesi kuinka monta yksikköä skripti pystyi käsittelemään sekunnissa .
vastaus
Pidän @Miata-vastauksesta, koska se kiinnittää huomiota date +%s
ratkaisu. @Miata sisältää kuitenkin .%N
, mutta en ole varma, mitä hyötyä saat nanosekunteista, kun date
-palvelun suorittamisesta on kustannuksia. komento alikuoressa. Joten käytännössä date +%s
pitäisi olla riittävä. Toinen huomioitava asia on date +%s
-kausi, joka on 1970-01-01 00:00:00 UTC. Tämä tarkoittaa, että ajankohdalla on absoluuttinen aikakausi ja voit jakaa ajanmittauksen shell-komentosarjan eri esiintymien tai eri koneiden välillä.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Pidän @glenn jackmanista ” Vastaus, koska se viittaa sisäänrakennettuun SECONDS
bash -muuttujaan. Tässä on huomioitava se aika, jolloin prosessi aloitettiin. Voimme siis käyttää tätä tekniikkaa vain mittaa aikoja asioille, jotka tapahtuvat kyseisessä komentosarjassa:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Toinen asia on, että laitan kaikki tehtävät (( ))
komento. ts. voit kirjoittaa uudelleen:
cmd=$(( some_expression ))
nimellä
(( cmd=some_expression ))
Tekemällä tämän , voimme minimoida $
-symbolin esiintymisen.
date '+%s.%N'
date -u
-toiminnolla, jotta vältetään DST ja paikalliset ongelmat komennossa. lue tämä vastauselapsed=$(dc -e "$end_time $start_time - p")