obține timp scurs în bash

Aș dori să fac următoarele la un moment dat într-un script:

start_time=date 

și aceasta după ce un proces sau procese au rulat:

end_time=date 

și apoi faceți acest lucru:

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

Cum aș face asta?

Comentarii

Răspuns

Folosiți timpul de la epocă pentru a identifica cu ușurință un interval de timp într-un script

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 nu acceptă numerele cu virgulă mobilă, așa că va trebui să utilizați un instrument extern precum bc pentru a compara timpi precum 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 

Comentarii

  • aceasta este Căutam .. poate include microtime?
  • Încercați date '+%s.%N'
  • Ar trebui să apelați data cu date -u pentru a evita DST și problemele locale cu comanda. Vă rugăm să citiți acest răspuns
  • Văzând cum (în mod tradițional) bc este implementat cu dc, puteți utiliza dc direct: elapsed=$(dc -e "$end_time $start_time - p")

Răspuns

bash are un variabilă de timer încorporat

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

Comentarii

  • Sau SECONDS=0; ...; echo "$SECONDS". Ferește-te de acea eroare .

Răspunde

@jasonwryan l-a sugerat deja, dar îl voi arunca ca răspuns, deoarece este, de asemenea, accesul meu atunci când vreau să cronometrez un script. Pentru a sincroniza myscript pur și simplu folosiți:

time myscript 

Comentarii

  • Voi încerca asta din când în când, dar asta este mai mult pentru când trebuie să izolați sau sub-secțiunile de timp ale scriptului meu ..
  • Acest lucru nu este util dacă doriți să utilizați timpul scurs derivat în cadrul script-ului în sine, de exemplu, pentru a calcula câte unități a putut procesa scriptul pe secundă .

Răspuns

Îmi place răspunsul @Miata „, deoarece atrage atenția asupra date +%s soluție. Cu toate acestea, @Miata include .%N, dar nu sunt sigur ce beneficii veți obține la nanosecunde atunci când există costul executării date comandă într-o sub-coajă. Deci, în practică, date +%s ar trebui să fie suficient. Celălalt lucru de remarcat este date +%s epoca este 1970-01-01 00:00:00 UTC. Ceea ce înseamnă că timpul are o epocă absolută și puteți împărtăși măsurarea timpului între diferite instanțe de script shell sau diferite mașini.

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

Îmi place @glenn jackman ” Răspunsul s, deoarece se referă la variabila încorporată SECONDS. Lucrul care trebuie remarcat aici este epoca, este momentul în care a fost început procesul. Deci, putem folosi această tehnică doar pentru măsurați timpii pentru lucrurile care se întâmplă în acel script:

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

Un alt lucru este să pun toate atribuțiile mele în (( )) comandă. adică puteți rescrie:

cmd=$(( some_expression )) 

ca

(( cmd=some_expression )) 

Procedând astfel , putem minimiza apariția simbolului $.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *