Іноді під час роботи з терміналом 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_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 "Command info:n%CnCPU usage: %PnExecution time: %e sec" tar -xvf ~/data/data.tar.gz -C ~/data
Весь текст, крім символів після %
, повністю відображається в терміналі. Це зручний спосіб розмітки