uzyskać upływ czasu w bash

Chciałbym w pewnym momencie wykonać następujące czynności w skrypcie:

start_time=date 

i to po uruchomieniu procesu lub procesów:

end_time=date 

a następnie zrób to:

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

Jak mam to zrobić?

Komentarze

Odpowiedź

Wykorzystaj czas, jaki upłynął od epoki, aby łatwo zidentyfikować przedział czasu w skrypcie

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 nie obsługuje liczb zmiennoprzecinkowych, więc będziesz musiał użyć zewnętrznego narzędzia, takiego jak bc, aby porównać czasy, takie jak 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 

Komentarze

  • to jest to Szukałem … czy to może obejmować mikrotime?
  • Wypróbuj date '+%s.%N'
  • Powinieneś wywołać datę z date -u, aby uniknąć czasu letniego i lokalnych problemów z poleceniem. Proszę przeczytaj tę odpowiedź
  • Widząc, jak (tradycyjnie) bc jest zaimplementowane w dc, możesz bezpośrednio użyć dc: elapsed=$(dc -e "$end_time $start_time - p")

Odpowiedź

bash ma wbudowana zmienna timera

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

Komentarze

Odpowiedź

@jasonwryan już to zasugerował, ale wrzucę to jako odpowiedź, ponieważ jest to również mój punkt wyjścia, gdy chcę określić czas skryptu. Aby określić czas mój skrypt , po prostu użyj:

time myscript 

Komentarze

  • Spróbuję tego od czasu do czasu, ale jest to bardziej przydatne, gdy muszę izolacja lub podsekcja czasu mojego skryptu ..
  • Nie jest to przydatne, jeśli chcesz użyć wyprowadzonego czasu, który upłynął w samym skrypcie, np. aby obliczyć, ile jednostek skrypt był w stanie przetworzyć na sekundę .

Odpowiedź

Podoba mi się odpowiedź @Miata „, ponieważ zwraca uwagę na date +%s rozwiązanie. Jednak @Miata zawiera .%N, ale nie jestem pewien, jaką korzyść odniesiesz, patrząc na nanosekundy, gdy występuje koszt wykonania date polecenie w podpowłoce. Dlatego w praktyce date +%s powinno wystarczyć. Inną rzeczą, na którą należy zwrócić uwagę, jest date +%s epoka to 1970-01-01 00:00:00 UTC. Co oznacza, że czas ma absolutną epokę i możesz dzielić pomiar czasu między różnymi instancjami skryptu powłoki lub różnymi maszynami.

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

Lubię @glenn jackman ” odpowiedź, ponieważ odnosi się do wbudowanej zmiennej bash SECONDS. Należy tu zwrócić uwagę na to, że epoka to czas rozpoczęcia procesu. Możemy więc użyć tej techniki tylko do mierzyć czas dla rzeczy, które dzieją się w tym skrypcie:

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

Inną rzeczą jest to, że umieszczam wszystkie moje zadania w (( )) polecenie. tzn. możesz przepisać:

cmd=$(( some_expression )) 

jako

(( cmd=some_expression )) 

Robiąc to , możemy zminimalizować występowanie symbolu $.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *