Jak mogę zmierzyć czas wykonania procesu terminalowego?

160

Próbuję zmierzyć czas wykonania procesu, który wywołuję za pomocą wiersza polecenia (tzn. Chcę dowiedzieć się, ile czasu zajmuje zakończenie procesu). Czy jest jakieś polecenie, które mogę dodać do polecenia wywołującego proces, który to osiągnie?

htorque
źródło

Odpowiedzi:

197

Dodaj timeprzed poleceniem, które chcesz zmierzyć. Na przykład: time ls.

Dane wyjściowe będą wyglądać następująco:

real    0m0.606s
user    0m0.000s
sys     0m0.002s

Wyjaśnienie real, useri sys(od man time):

  • real: Upływający rzeczywisty (zegar ścienny) czas wykorzystywany przez proces, w sekundach.
  • user: Łączna liczba sekund procesora wykorzystywanych bezpośrednio przez proces (w trybie użytkownika), w sekundach.
  • sys: Łączna liczba sekund CPU wykorzystywanych przez system w imieniu procesu (w trybie jądra), w sekundach.
ninjalj
źródło
1
@ninjalj, czy możesz podać więcej informacji o tym real, co useri syskiedy zwraca to polecenie?
Christopher Kyle Horton
2
@JacobVlijm Ta odpowiedź nie jest tak skomplikowana. :) Możesz edytować w swoim komentarzu i tak to zrobić.
muru
1
Pamiętaj, że możesz potrzebować, sudo apt-get install timejeśli używasz powłoki, która timenie jest wbudowana.
poolie
1
Zauważ, że jest to wynik timewbudowany w Bash , ale man timedotyczyłby pliku wykonywalnego (np. /usr/bin/timeZ timepakietu), a jego wynik wyglądałby inaczej. Również w Bash możesz ubiegać się help timeo pomoc z wbudowanym.
wjandrea
Pamiętaj, że zakończenie procesu nie oznacza, że ​​cała praca została zakończona. Kopiowanie może potrwać dodatkowe minuty po powrocie „czasu” dla buforów systemu opróżniania (w tym również z nieprzydzielonym czasem sys).
ubfan1
43

Do pomiaru delta linia po linii spróbuj gnomon .

Jest to narzędzie wiersza poleceń, trochę jak ts moreutils, do dodawania informacji o znaczniku czasu do standardowego wyjścia innego polecenia. Przydatny w długotrwałych procesach, w których potrzebujesz historycznego zapisu tego, co trwa tak długo.

Przesłanie czegokolwiek do gnomona spowoduje wstawienie znacznika czasu do każdej linii, wskazując, jak długo ta linia była ostatnią linią w buforze - to znaczy, ile czasu zajęło wyświetlenie 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
2
To całkiem sprytne.
Nathan Arthur
1
(literówka w linku, na szczęście URL w porządku). Możesz go zainstalować, sudo npm i gnomon -gjeśli masz npm. Nie jestem pewien, jak dobrze radzi sobie z liniami „postępu” za pomocą „\ r” (pozostawanie na tej samej linii): w takim przypadku chciałbym, aby liczyło to wszystko jako jedną długą linię, a nie osobne.
Tomasz Gandor
więc doprowadzamy to do gnomona! Otóż ​​to ?
Ciasto piekarz
26

Możesz użyć time:

time ls -R
William Niu
źródło
8
date +"%T" && cp -r ./file  /destination/folder/here && date +"%T"

Uruchomienie tego polecenia w terminalu da ci całkowity czas na skopiowanie pliku

użytkownik314473
źródło
To da ci czas rozpoczęcia i czas zakończenia, a nie czas trwania.
wjandrea
To dobra odpowiedź, w pewnych okolicznościach. Na przykład następujące findpolecenie - bez 2>/dev/nullprzekierowania - wyświetla obfite Permission denied wiadomości. Jednak dodanie 2>/dev/nulldo tego polecenia powoduje przerwanie timeczęści tego polecenia. Następujące zapewnia dobry kompromis: START="$(date +"%s")" && find 2>/dev/null / -path /mnt -prune -o -name "*libname-server-2.a*" -print; END="$(date +"%s")"; TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"podając (np.) /usr/lib/libname-server-2.a find command took 3 sec Jako jedyny wynik.
Victoria Stuart
Dodatek do mojego komentarza: oczywiście możesz po prostu uruchomić time sudo find / -path /mnt -prune -o -name "*libname-server-2.a*" -print(tj. As sudo) - unikając licznych Permission deniedostrzeżeń.
Victoria Stuart
4

Czasami potrzebuję stopera, aby policzyć, ile czasu zajmuje wykonanie takiego działania, jak uruchomienie aplikacji, w którym to przypadku wiele rozwiązań tutaj nie jest przydatnych.

Do tego lubię używać sw .

południowy zachód

zainstalować

wget -q -O - http://git.io/sinister | sh -s -- -u https://raw.githubusercontent.com/coryfklein/sw/master/sw

Stosowanie

sw
 - start a stopwatch from 0, save start time in ~/.sw
sw [-r|--resume]
 - start a stopwatch from the last saved start time (or current time if no last saved start time exists)
 - "-r" stands for --resume
Cory Klein
źródło
0
time -v command

-v daje więcej informacji

Himanshu Mishra
źródło