Czy można wydrukować czas wykonania polecenia powłoki z następującą kombinacją?
root@hostname:~# "command to execute" && echo "execution time"
Odpowiedzi:
Nie zapominaj, że istnieje różnica między wbudowanym basha time
(który powinien być wywoływany domyślnie, gdy to zrobisz time command
) a /usr/bin/time
(który powinien wymagać wywołania go pełną ścieżką).
Wbudowane time
zawsze drukuje na stderr, ale /usr/bin/time
pozwoli ci wysłać wynik czasu do określonego pliku, więc nie będziesz ingerować w strumień stderr wykonywanego polecenia. Ponadto /usr/bin/time
format można konfigurować w wierszu poleceń lub za pomocą zmiennej środowiskowej TIME
, podczas gdy time
format wbudowany basha jest konfigurowany tylko przez TIMEFORMAT
zmienną środowiskową.
$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357
real 0m3.194s
user 0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
help time
ponieważ tylko zerknąłem na to i pomyślałem, że to argument wiersza poleceń. Zaktualizuję odpowiedź.
time
jest poleceniem wbudowanym w większość powłok, które zapisuje informacje o czasie wykonywania do terminala.
Możesz też spróbować czegoś takiego
start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.
Lub w bash
:
start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
time
używa milisekund. A jeśli chcesz zmierzyć czas dla kilku poleceń bez konieczności używania zmiennych i obliczeń, możesz użyć nawiasów: time ( command1 ; command2 ; command3 )
możesz nawet ustawić je indywidualnie razem z całkowitym czasem, na przykład: time ( time command1 ; time command2 ; time command3 )
Oczywiście, jeśli chcesz około dwudziestu poleceń, możesz lepiej użyć rozwiązania tej odpowiedzi. Ale wtedy powinieneś zacząć myśleć o umieszczeniu wszystkich poleceń w skrypcie ...
root@hostname:~# time [command]
Rozróżnia również czas używany w czasie rzeczywistym i czas systemowy.
time
zapisuje do tty, a nie stderr. Co, jak sądzę, pogarsza sprawę.
Aby dokonać pomiaru delta linia po linii, wypróbuj gnonom .
Jest to narzędzie wiersza poleceń, trochę podobne do ts moreutils, służące do dołączania informacji o sygnaturze czasowej na standardowe wyjście innego polecenia. Przydatne w przypadku długotrwałych procesów, w których chcesz mieć historyczny zapis tego, co trwa tak długo.
Przekazanie czegokolwiek do gnomona spowoduje dołączenie sygnatury czasowej do każdej linii, wskazującej, jak długo ta linia była ostatnią linią w buforze - to znaczy, ile czasu zajęło pojawienie się następnej linii. Domyślnie gnomon wyświetla sekundy, które upłynęły między każdą linią, ale można to skonfigurować.
Jeśli zaczynam długotrwały proces, taki jak kopiowanie lub hasz, i chcę wiedzieć później, ile czasu to zajęło, po prostu robię to:
$ date; sha1sum reallybigfile.txt; date
Co spowoduje następujący wynik:
Tue Jun 2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0 reallybigfile.txt
Tue Jun 2 21:33:54 PDT 2015
To prawda, jak zaimplementowano tutaj, nie jest zbyt precyzyjny i nie oblicza czasu, który upłynął. Ale to proste i czasami wszystko, czego potrzebujesz.
W zsh możesz użyć
=time ...
W bash lub zsh możesz użyć
command time ...
Te (poprzez różne mechanizmy) wymuszają użycie zewnętrznego polecenia.
Właśnie ps -o etime= -p "<your_process_pid>"
man bash
: „Zmienna TIMEFORMAT może być ustawiona na łańcuch formatu, który określa sposób wyświetlania informacji o taktowaniu”