Іноді під час роботи з терміналом 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

Весь текст, крім символів після %, повністю відображається в терміналі. Це зручний спосіб розмітки