Способи оплати Abuse

Команда Time в Linux

18.03.2022, 01:39

Іноді під час роботи з терміналом 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. Тепер перейдемо до сценаріїв використання команди.

Час виконання команди LINUX

Розглянемо три основні приклади, які досить часто використовуються: виведення даних у термінал, виведення в окремий файл і виведення з форматуванням.

Виведення часу виконання в термінал

Як приклад ми візьмемо команду 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.
  • Завантаженість CPU - специфікатор%P.
  • Загальний час виконання в секундах - специфікатор%e.

Для комфортного сприйняття кожен пункт буде виводитися в окремому рядку за допомогою роздільника n. При цьому вони всі будуть підписані зрозумілим чином.

Ось який вигляд має підсумковий варіант команди:

sudo time -f "Command info:n%CnCPU usage: %PnExecution time: %e sec" tar -xvf ~/data/data.tar.gz -C ~/data

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