hanki kulunut aika bashissa

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

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

  • tämä on mitä Etsin .. Voiko tähän sisältyä mikroaikaa?
  • Kokeile date '+%s.%N'
  • Sinun tulee soittaa päivämäärään date -u -toiminnolla, jotta vältetään DST ja paikalliset ongelmat komennossa. lue tämä vastaus
  • Nähdäksesi, miten (perinteisesti) bc toteutetaan dc: llä, voit käyttää dc: tä suoraan: elapsed=$(dc -e "$end_time $start_time - p")

vastaus

bashilla on sisäänrakennettu ajastinmuuttuja

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

Kommentit

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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *