Czasami podczas pracy z terminalem Linuksa trzeba znać czas wykonania niektórych poleceń, na przykład w celu śledzenia problemów. Do tego celu służy narzędzie o nazwie time
. Powiemy ci, jak działa polecenie Linux time
i jaka jest jego składnia. Następnie przejdziemy do opisu dostępnych opcji. Na koniec wspomnimy o kilku popularnych scenariuszach użycia.
Narzędzie uruchamia polecenie zdefiniowane przez użytkownika, a następnie wyświetla informacje o czasie jego wykonania. Jego składnia jest dość wygodna. Najpierw należy określić opcje czasu
, następnie polecenie do wykonania, a na końcu argumenty do niego:
$ time [options] command_to_execute [arguments]
Rozważmy listę dostępnych opcji:
-o
, --output
- zapisywanie danych do wybranego pliku zamiast standardowego wyjścia w terminalu. W tym przypadku stare dane w pliku zostaną nadpisane.-a
, --append
- dodanie nowych informacji do pliku zamiast nadpisywania starych. Opcja jest użyteczna tylko w połączeniu z -o
.-f
, --format
- wybór określonego formatu wyjściowego. Szczegóły dotyczące formatowania zostały opisane w następnej sekcji tego artykułu.-p
, --profitably
- używa formatu wyjścia danych zgodnego ze standardem POSIX 1003.2.-v
, --verbose
- wypisuje szczegółowe informacje o wykonaniu programu.-V
, --version
- wyświetla wersję programu narzędziowego time
.Ta lista zawiera tylko podstawowe opcje. Szczegółowe informacje można uzyskać za pomocą polecenia :
$ man time
Domyślnie time
może wyświetlać informacje w formie, która nie jest wygodna do czytania,
Pożądane jest ustawienie opcji formatowania danych wyjściowych, które zostaną teraz omówione. W sumie są trzy z nich. Weźmy jako przykład polecenie apt-get
update.
Opcja -v
służy do wyświetlania szczegółowych informacji:
$ sudo time -v apt-get update
Opcja -p
jest potrzebna do wyprowadzenia danych w formacie zgodnym z POSIX 1003.2:
$ sudo time -p apt-get update
Linia danych formatowania zazwyczaj zawiera specyfikatory zasobów i zwykły tekst. Znak %
wskazuje, że następujący po nim znak powinien być traktowany jako specyfikator zasobów.
Znak służy do określenia znaku separatora. Dostępne są trzy opcje:
t
- tabulator, n
- nowa linia, \
- ukośnik odwrotny. Jeśli podasz jakikolwiek inny znak po , terminal wyświetli znak zapytania (
?
), co oznacza błąd wprowadzania.
Reszta tekstu w ciągu formatu jest w całości kopiowana do pola wyjściowego. W tym przypadku time
zawsze rozpoczyna wyprowadzanie danych od nowej linii po informacji o wykonaniu samego polecenia.
Rozważmy dostępne specyfikatory zasobów:
%
- dosłowne %. tj. aby wyprowadzić znak procentu, należy podać %% w poleceniu.C
- nazwa polecenia i użyte argumenty.D
- średni rozmiar niepodzielonego obszaru danych. Jest wyświetlany w kilobajtach.E
- rzeczywisty czas wykonania polecenia w zwykłym formacie godzinowym. Jest wyświetlany jako [godziny:]<minuty:sekundy
.N
- liczba błędów głównych lub błędów we/wy, które wystąpiły podczas wykonywania procesu.I
- liczba dostępów do systemu plików.K
- średnia wartość pamięci wykorzystanej na kod(tekst
), zainicjalizowane dane(dane
) istos (stos
). Wyświetlana jest w kilobajtach.M
- maksymalny rozmiar zestawu rezydentnego podczas wykonywania procesu w kilobajtach.O
- liczba wyjść z systemu plików.P
- procent obciążenia CPU (centralnej jednostki przetwarzania).R
- liczba pomniejszych błędów.S
- czas w sekundach, w którym procesor był używany przez system w imieniu procesu w trybie nadzorcy(
trybjądra
).U
- czas w sekundach, w którym procesor był używany przez proces bezpośrednio w trybieużytkownika
.W
- ile razy proces został wyładowany z pamięci RAM.Z
- rozmiar strony systemowej. Wartość ta jest stała, ale różni się w zależności od systemu.c
- liczba mimowolnych przełączeń kontekstu podczas wykonywania procesu.e
- rzeczywisty czas wykonania polecenia w zwykłym formacie godzinowym. Wyświetlany jest w sekundach.k
- liczba sygnałów, które dotarły do procesu.p
- średni rozmiar niewspółdzielonego stosu procesu, w kilobajtach.r
- liczba odebranych komunikatów gniazda.s
- liczba wysłanych komunikatów gniazda.t
- średni rozmiar zestawu rezydentnego procesu, w kilobajtach.w
- liczba dobrowolnych przełączeń kontekstu podczas wykonywania procesux
- kod powrotu dla polecenia.To były wszystkie specyfikatory zasobów używane przy wyborze formatowania dla czasu
. Przejdźmy teraz do scenariuszy użycia polecenia.
Przyjrzyjmy się trzem podstawowym przykładom, które są dość powszechnie używane: wyjście do terminala, wyjście do osobnego pliku i wyjście z formatowaniem.
Jako przykład weźmiemy polecenie sleep, które wstrzymuje działanie na określony czas. Będzie to bardzo czytelny przykład, ponieważ czas pauzy pokrywa się z czasem
wykonania polecenia:
$ time sleep 3
Czas jest zapisany od razu w trzech kolumnach. Przejdźmy przez każdą z nich:
real
- całkowity czas od rozpoczęcia wykonywania procesu do jego zakończenia.
user
- czas, w którym proces działał w trybieużytkownika
.
sys
- czas, w którym proces był zaangażowany w tryb nadzorcy(
trybjądra
).
Kolejnym przydatnym scenariuszem jest wyświetlenie czasu potrzebnego do załadowania nagłówka strony internetowej za pomocą narzędzia curl
. Jako przykład weźmy naszą stronę internetową:
$ time curl -I https://losst.ru
Powinniśmy wspomnieć o sytuacji, w której wykonanie polecenia powoduje przełączenie okna terminala w inny tryb, na przykład po uruchomieniu edytora nano w celu zmodyfikowania pliku /home/root-user/script.txt
:
$ time nano /home/root-user/scripts/main_script.txt
Po zakończeniu pracy edytora zobaczysz całkowity czas pracy nad plikiem.
Teraz już wiesz, jak sprawdzić czas wykonania polecenia systemu Linux.
Informacje o wynikach polecenia time można zapisać do osobnego pliku za pomocą opcji-o
. W takim przypadku nie będą one wyświetlane w oknie terminala. Weźmy przykład rozpakowania zawartości archiwum ~/data/data.tar.gz
za pomocą narzędzia tar
. Zapiszmy informacje o czasie wykonania w nowym pliku ~/data/data_time.txt.
Dodamy również opcję-v
do polecenia, aby uzyskać szczegółowe informacje:
$ sudo time -v -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
Plik będzie miał następującą zawartość.
Jeśli używasz opcji -o
, pamiętaj, że nadpisuje ona stare informacje w pliku wyjściowym nowymi. Ma to zastosowanie podczas tworzenia nowych plików, ale nie nadaje się do rejestrowania. Z opcjonalną opcją -a, nadpisanie zawartości jest zastępowane przez dodanie nowych informacji:
$ sudo time -v -a -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
Oryginalna opcja formatowania danych nie jest odpowiednia we wszystkich przypadkach. Jako przykład weźmiemy poprzednio używane polecenie wyodrębniania archiwum, ale nie zapiszemy danych do pliku. Podczas jej wykonywania jesteśmy zainteresowani:
specyfikator%C
. specyfikator%P
. specyfikator%e
.Dla wygody percepcji, każdy element będzie wyświetlany w osobnej linii przy użyciu separatora n
. Jednocześnie wszystkie zostaną podpisane w zrozumiały sposób.
Oto jak wygląda ostateczna wersja polecenia:
sudo time -f "Command info:n%CnCPU usage: %PnExecution time: %e sec" tar -xvf ~/data/data.tar.gz -C ~/data
Cały tekst z wyjątkiem znaków po %
jest w pełni wyświetlany w terminalu. Jest to wygodny sposób oznaczania