Wyświetla czas wykonania polecenia powłoki

88

Czy można wydrukować czas wykonania polecenia powłoki z następującą kombinacją?

root@hostname:~# "command to execute" && echo "execution time"
Jacek
źródło

Odpowiedzi:

72

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 timezawsze drukuje na stderr, ale /usr/bin/timepozwoli ci wysłać wynik czasu do określonego pliku, więc nie będziesz ingerować w strumień stderr wykonywanego polecenia. Ponadto /usr/bin/timeformat można konfigurować w wierszu poleceń lub za pomocą zmiennej środowiskowej TIME, podczas gdy timeformat wbudowany basha jest konfigurowany tylko przez TIMEFORMATzmienną ś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
Mark Rushakoff
źródło
Od man bash: „Zmienna TIMEFORMAT może być ustawiona na łańcuch formatu, który określa sposób wyświetlania informacji o taktowaniu”
Wstrzymano do odwołania.
Ups - myślałem , że istnieje sposób na sformatowanie tego, ale przegapiłem to, help timeponieważ tylko zerknąłem na to i pomyślałem, że to argument wiersza poleceń. Zaktualizuję odpowiedź.
Mark Rushakoff
2
Tutaj jesteśmy 9 lat później, a polecenie zajęło tylko 0m0,018s. Pomyślałem, że zwrócę na to uwagę.
Ghassen Louhaichi
112

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
tłum
źródło
zgodził się z Maazą, ta elastyczność pozwoliła mi zmierzyć czas całego zestawu poleceń.
Nath
Czy można zastosować aspekty Linuksa do dowolnego polecenia Linuksa do obliczenia wykonania
Syed Mazreena
1
Wadą tego podejścia jest to, że mierzy w sekundach, podczas gdy timeuż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 ...
msb
25
root@hostname:~# time [command]

Rozróżnia również czas używany w czasie rzeczywistym i czas systemowy.

Jason
źródło
To jest z pewnością podstawowa odpowiedź - ale są pewne komplikacje, jeśli chcesz zobaczyć wyjście błędu z polecenia, a mimo to wysłać informacje o taktowaniu na standardowe wyjście, tak jak w pytaniu. Polecenie time zapisuje na stderr. To, co sugerujesz, jest prawdopodobnie wystarczająco dokładne - stąd moje +1.
Jonathan Leffler
2
timezapisuje do tty, a nie stderr. Co, jak sądzę, pogarsza sprawę.
mob
12

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ć.

demo gnomon

Janus Troelsen
źródło
8

Dodawanie do odpowiedzi @ mob:

Dołączenie %Ndo date +%sdaje nam dokładność nanosekundową:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`
nav
źródło
5

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.

Ethan
źródło
4

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.

überRegenbogen
źródło
0

Właśnie ps -o etime= -p "<your_process_pid>"

Alejandro Galera
źródło