Иногда при работе с терминалом Linux нужно знать время выполнения тех или иных команд, например, для отслеживания проблем. Для этой задачи существует утилита time. Расскажем, как работает команда time Linux
и какой у неё синтаксис. Затем перейдем к описанию доступных опций. А в конце упомянем несколько популярных сценариев использования.
Утилита запускает заданную пользователем команду и после этого выводит информацию о времени ее выполнения. У нее достаточно удобный синтаксис. Сначала нужно указать опции для time, затем – выполняемую команду, а в конце – аргументы к ней:
$ time [options] command_to_execute [arguments]
Рассмотрим список доступных опций:
-o
, --output
– сохранять данные в выбранный файл вместо стандартного вывода в терминале. При этом старые данные в файле будут перезаписаны.-a
, --append
– добавлять в файл новую информацию, а не перезаписывает старую. Опция полезна только в сочетании с -o
.-f
, --format
– выбрать определенный формат вывода. Подробности о форматировании описаны в следующем разделе статьи.-p
, --profitably
– использовать формат вывода данных для соответствия со стандартом POSIX 1003.2.-v
, --verbose
– выводить подробную информацию о выполнении программы.-V
, --version
– вывести версию утилиты time.В этом списке представлены только основные опции. Получить подробную информацию можно командой:
$ man time
По умолчанию time
может выводить информацию в не комфортном для чтения виде,
Для нее желательно задавать опции форматирования вывода, о которых и пойдет сейчас речь. Всего их три штуки. В качестве примера для их рассмотрения возьмем команду apt-get update
.
Опция -v используется для вывода подробной информации:
$ sudo time -v apt-get update
Опция -p
нужна для вывода данных в формате, соответствующем стандарту POSIX 1003.2:
$ sudo time -p apt-get update
Строка с данными о форматировании, как правило, включает в себя спецификаторы ресурсов и обычный текст. Знак % обозначает, что следующий после него символ следует воспринимать как спецификатор ресурсов.
С помощью знака \
задается разделительный символ. Есть три доступных варианта: \t
– табуляция, \n
– новая строка, \\
– обратная косая черта. Если после \
указать любой другой символ, то в терминале появится вопросительный знак (?
), который говорит об ошибке ввода.
Остальной текст в строке формата полностью копируется в поле вывода. При этом time
всегда начинает вывод данных с новой строки после информации о выполнении самой команды.
Рассмотрим доступные спецификаторы ресурсов:
%
– литерал %. То есть для вывода знака процента нужно в команде указать %%.С
– имя команды и использованные аргументы.D
– средний размер неразделенной области данных. Отображается в килобайтах.E
– реальное время выполнения команды в привычном часовом формате. Выводится в виде [Hours:]<imutes:seconds.N
– количество мажорных ошибок или ошибок, связанных с вводом-выводом, возникших при выполнении процесса.I
– количество входов в файловую систему.K
– среднее значение задействованной памяти для кода (text), инициализированных данных (data) и стека (stack). Отображается в килобайтах.M
– максимальный размер резидентного множества во время выполнения процесса в килобайтах.O
– количество выходов из файловой системы.P
– процент загруженности CPU (центрального процессора).R
– количество минорных ошибок.S
– время в секундах, в течении которого CPU использовался системой от имени процесса в режиме супервизора (kernel mode).U
– время в секундах, в течении которого CPU использовался процессом напрямую в пользовательском режиме (user mode).W
– сколько раз процесс был выгружен из оперативной памяти.Z
– размер системной страницы. Это значение – константа, но она различается между системами.c
– количество невольных переключений контекста при выполнении процесса.e
– реальное время выполнения команды в привычном часовом формате. Выводится в секундах.k
– количество сигналов, дошедших до процесса.p
– средний размер неразделенного стека процесса, в килобайтах.r
– количество полученных сокетных сообщений.s
– количество отправленных сокетных сообщений.t
– средний размер резидентного множества процесса, в килобайтах.w
– количество добровольных переключений контекста при выполнении процессаx
– код возврата для команды.Это были все спецификаторы ресурсов, использующиеся при выборе форматирования для time
. Теперь перейдем к сценариям использования команды.
Рассмотрим три основных примера, которые довольно часто используются: вывод данных в терминал, вывод в отдельный файл и вывод с форматированием.
В качестве примера мы возьмем команду sleep, которая делает паузу на указанное время. Это будет очень наглядный пример, ведь время паузы будет совпадать с временем выполнения команды в time
:
$ time sleep 3
В
ремя записано сразу же в трех графах. Пройдемся по каждой из них:
real
– общее время от начала выполнения процесса и до его завершения.
user
– время, в течение которого процесс был задействован в режиме пользователя (user mode).
sys
– время, в течение которого процесс был задействован в режиме супервизора (kernel mode).
Следующий полезный сценарий – вывод времени, в течение которого загрузится заголовок веб-страницы через утилиту curl
. В качестве примера возьмем наш сайт:
$ time curl -I https://losst.ru
Нужно сказать о ситуации, когда выполнение команды переводит окно терминала в другой режим, например, при запуске редактора nano для изменения файла /home/root-user/script.txt
:
$ time nano /home/root-user/scripts/main_script.txt
После завершения работы редактора вы увидите общее время, в течение которого вы работали с файлом.
Теперь вы знаете как посмотреть время выполнения команды Linux.
Информацию о результатах работы команды time можно сохранить в отдельный файл с помощью опции-o
. В таком случае в окне терминала они выводиться не будут. Возьмем для примера извлечение содержимого архива ~/data/data.tar.gz
с помощью утилиты tar
. Информацию о времени выполнения сохраним в новом файле ~/data/data_time.txt
. Еще добавим к команде опцию-v
, чтобы получить подробные сведения:
$ sudo time -v -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
Файл получится следующего содержания.
В случае использования опции -o
следует помнить, что она перезаписывает старую информацию в выходном файле на новую. Это применимо при создании новых файлов, но для ведения логов не подходит. С помощью дополнительной опции -a перезапись содержимого заменяется на добавление новой информации:
$ sudo time -v -a -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
Исходный вариант форматирования данных подходит далеко не во всех случаях. В качестве примера мы возьмем ранее использованную команду для извлечения архива, но не станем сохранять данные в файл. При ее выполнении нам интересно:
%C
.%P
.%e
.Для комфортного восприятия каждый пункт будет выводиться в отдельной строке с помощью разделителя\n. При этом они все будут подписаны понятным образом.
Вот как выглядит итоговый вариант команды:
$ sudo time -f "Информация о команде:\n%C\nЗагруженность CPU: %P\nВремя выполнения: %e сек" tar -xvf ~/data/data.tar.gz -C ~/data
Весь текст, кроме символов после %\, полностью отображается в терминале. Это удобный способ разметки
Примените скидку, вставив промокод в специальное поле при оформлении заказа: