získejte uplynulý čas v bash

Chtěl bych ve skriptu udělat následující:

start_time=date 

a to po spuštění procesu nebo procesů:

end_time=date 

a proveďte toto:

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

Jak bych to udělal?

Komentáře

Odpověď

Použijte čas od epochy ke snadné identifikaci rozpětí času ve skriptu

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 nepodporuje čísla s plovoucí desetinnou čárkou, takže pro porovnání časů jako je třeba bc musíte použít externí nástroj 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 

Komentáře

  • to je to Hledal jsem .. může to zahrnovat mikrotime?
  • Zkuste date '+%s.%N'
  • Měli byste volat datum pomocí date -u, abyste předešli DST a místním problémům s příkazem. přečtěte si tuto odpověď
  • Vzhledem k tomu, jak (tradičně) je bc implementován pomocí dc, můžete použít přímo dc: elapsed=$(dc -e "$end_time $start_time - p")

Odpověď

bash má proměnná vestavěného časovače

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

Komentáře

  • Nebo SECONDS=0; ...; echo "$SECONDS". Pozor však na tuto chybu .

Odpovědět

@jasonwryan to již navrhl, ale hodím to jako odpověď, protože to je také můj go-to, když chci načasovat skript. Načasování myscript jednoduše použijte:

time myscript 

Komentáře

  • Z času na čas to zkusím, ale tohle je více, když potřebuji izolovat nebo časové podsekce mého skriptu.
  • To není užitečné, pokud chcete použít odvozený uplynulý čas v samotném skriptu, např. k výpočtu, kolik jednotek byl skript schopen zpracovat za sekundu .

Odpověď

Líbí se mi odpověď od @Miata, protože upozorňuje na date +%s řešení. @Miata však obsahuje .%N, ale nejsem si jistý, jakou výhodu získáte při pohledu na nanosekundy, když budou náklady na provedení date příkaz v subshell. V praxi by tedy date +%s mělo stačit. Další věc, kterou je třeba poznamenat, je date +%s epocha 1970-01-01 00:00:00 UTC. Což znamená, že čas má absolutní epochu a měření času můžete sdílet mezi různými instancemi shell skriptu nebo různými stroji.

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

Líbí se mi @glenn jackman “ s odpovědí, protože odkazuje na SECONDS vestavěnou proměnnou bash. Je třeba si uvědomit, že epocha je čas, kdy byl proces spuštěn. Tuto techniku tedy můžeme použít pouze k změřte časy věcí, které se v daném skriptu stanou:

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

Další věcí je, že všechny své úkoly vložím do (( )) příkaz. tj. můžete přepsat:

cmd=$(( some_expression )) 

jako

(( cmd=some_expression )) 

Tímto způsobem , můžeme minimalizovat výskyt $ symbolu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *