Время выполнения команды Linux

Обновлено: 21.11.2024

В некоторых случаях вам может понадобиться узнать, сколько времени потребовалось для выполнения команды или скрипта. Вы можете отслеживать время начала и окончания и вычислять разницу, чтобы получить продолжительность. Вы даже можете взять свое надежное приложение секундомера и таким образом отслеживать события. Или вы можете избавить себя от всех этих проблем, используя команду времени.

Командная строка содержит множество небольших одноцелевых утилит, которые могут помочь устранить необходимость самостоятельного написания дополнительного кода. Команда времени является одной из таких команд. Команда time никоим образом не связана с командой date, которая предоставляет системную дату и время. Вместо этого он измеряет время выполнения программы или скрипта и сообщает, сколько времени это заняло.

В этом руководстве вы будете использовать команду time и изучать ее выходные данные.

В примерах в этом руководстве (если не указано иное) будет использоваться время, встроенное в оболочку Bash в Linux.

Запустите интерактивный терминал!

Шаг 1 — Время выполнения команды

Чтобы рассчитать продолжительность выполнения команды, вы добавляете к ней префикс time .

Однако то, как вы выполняете time, зависит от вашей операционной системы. time существует как встроенная команда для некоторых оболочек, таких как bash и zsh , а также как отдельная команда, известная как время GNU, которая имеет другие аргументы, чем время, встроенное в оболочки.

Используйте следующую команду, чтобы увидеть, как работает время в вашей системе:

Вы увидите следующий вывод:

В этом случае имеется как встроенная команда оболочки time , так и версия time, установленная в /usr/bin/time .

Если вы хотите вместо этого использовать версию времени GNU, вы можете поставить перед ней обратную косую черту:

Если вы этого не сделаете, ваша оболочка будет использовать встроенную версию.

Примечание: в оболочке fish нет собственной реализации time . Если вы используете fish , убедитесь, что у вас установлена ​​команда времени GNU.

Оба метода служат одной цели, хотя версия GNU имеет более расширенные возможности форматирования.

Давайте рассмотрим выполнение программы синхронизации с помощью команды дерева в корне / вашей файловой системы, которая выведет визуальное дерево всех ваших файлов и каталогов.

Команда tree не всегда устанавливается по умолчанию во многих системах, но вы можете установить ее в системах Ubuntu и Debian с помощью apt :

В macOS вы можете установить дерево с помощью Homebrew:

Теперь, когда команда дерева установлена, используйте ее для просмотра всех файлов в системе, но добавьте к ней префикс времени, чтобы увидеть, сколько времени это займет:

Вы увидите прокрутку информации о файле. В конце концов, он остановится и покажет вам затраченное время:

Обратите внимание, что команда, которую вы выполнили, tree / , также повторяется командой time. В выходных данных отображается несколько фрагментов информации, но сейчас сосредоточьтесь на общей сумме и числе перед ним:

Это время выполнения команды в секундах.

Команда времени также работает, если вы отменили команду с помощью CTRL+C . Если вы снова запустите дерево времени / и быстро нажмете CTRL+C , команда дерева перестанет прокручиваться, и вам будут представлены результаты времени для времени, когда команда выполнялась до того, как вы ее остановили.

Шаг 2. Понимание использования ресурсов

Вывод времени включает три значения в дополнение к общей продолжительности.

Во-первых, это общее количество времени (в процессорных секундах), которое команда провела в пользовательском режиме. Это значение с user после него.

Следующий параметр с суффиксом system указывает количество времени (опять же в процессорных секундах), которое команда провела в системе или в режиме ядра.

Наконец, процент ЦП, который был выделен команде, с суффиксом cpu .

Разница между пользовательским и системным временем заключается в том, что загрузка ЦП разбивается по уровням доступа. Когда код выполняется в пользовательском режиме, он не имеет прямого доступа к оборудованию или эталонной памяти и должен полагаться на API системы для делегирования. Именно так работает большая часть кода в вашей системе, и благодаря его изоляции сбои всегда можно восстановить.

С другой стороны, в режиме ядра исполняемый код имеет неограниченный доступ к системному оборудованию. Этот режим в значительной степени зарезервирован для наиболее надежных функций операционной системы. Из-за наличия полного доступа, когда что-то выходит из строя в режиме ядра, это приводит к серьезному сбою и, как правило, приводит к падению системы вместе с ними.

Заключение

В этом руководстве вы узнали, как использовать команду времени, чтобы узнать, сколько времени требуется для выполнения команд и сценариев и куда уходит это время. Команда time вашей оболочки дает вам быстрый доступ к времени выполнения команды без каких-либо дополнительных сценариев.

Хотите узнать больше? Присоединяйтесь к сообществу DigitalOcean!

Присоединяйтесь к нашему сообществу DigitalOcean, насчитывающему более миллиона разработчиков, бесплатно!Получайте помощь и делитесь знаниями в нашем разделе "Вопросы и ответы", находите руководства и инструменты, которые помогут вам расти как разработчику и масштабировать свой проект или бизнес, а также подписывайтесь на интересующие вас темы.

Вы, вероятно, знаете время запуска команды/процесса и как долго процесс выполняется в Linux и Unix-подобных системах. Но как узнать, когда завершилась команда или процесс и/или сколько времени потребовалось для выполнения команды/процесса? Ну, это легко! В Unix-подобных системах есть утилита GNU time, специально предназначенная для этой цели. Используя утилиту Time, мы можем легко измерить общее время выполнения команды или программы в операционных системах Linux. Хорошо, что команда time предустановлена ​​в большинстве дистрибутивов Linux, так что вам не нужно возиться с установкой.

Найти время выполнения команды или процесса в Linux

Чтобы измерить время выполнения команды/программы, просто запустите ее.

Пример вывода:

Приведенные выше команды отображают общее время выполнения команды ' ls '. Замените " ls " любой командой/процессом по вашему выбору, чтобы узнать общее время выполнения.

  1. реальный – относится к общему времени, затраченному командой/программой,
  2. user – указывает время, затраченное программой в пользовательском режиме.
  3. sys — указывает время, затраченное программой в режиме ядра.

Мы также можем ограничить выполнение команды только в течение определенного времени. Дополнительные сведения см. в следующем руководстве.

время против /usr/bin/time

Как вы могли заметить, в приведенных выше примерах мы использовали две команды «время» и «/usr/bin/time». Итак, вам может быть интересно, в чем разница между ними.

Во-первых, давайте посмотрим, что на самом деле ' time ' использует команда ' type '. Для тех, кто не знает, команда Type используется для получения информации о команде Linux. Дополнительные сведения см. в этом руководстве.

Как видно из приведенного выше вывода, время — это и то, и другое

  • Ключевое слово, встроенное в оболочку BASH
  • Исполняемый файл, например /usr/bin/time

Поскольку ключевые слова оболочки имеют приоритет над исполняемыми файлами, когда вы просто запускаете команду времени без полного пути, вы запускаете встроенную команду оболочки. Но когда вы запускаете /usr/bin/time , вы запускаете реальную программу времени GNU. Итак, чтобы получить доступ к настоящей команде, вам может потребоваться указать ее явный путь. Прозрачный? Хорошо!

Встроенное ключевое слово оболочки «время» доступно в большинстве оболочек, таких как BASH, ZSH, CSH, KSH, TCSH и т. д. Ключевое слово оболочки «время» имеет меньше параметров, чем исполняемые файлы. Единственная опция, которую вы можете использовать в ключевом слове «время», это -p .

Теперь вы знаете, как найти общее время выполнения данной команды/процесса с помощью команды 'time'. Хотите узнать немного больше об утилите «GNU time»? Читайте дальше!

Краткое введение в программу GNU time

Программа времени GNU запускает команду/программу с заданными аргументами и суммирует использование системных ресурсов в виде стандартного вывода после выполнения команды. В отличие от ключевого слова «время», программа времени GNU отображает не только время, используемое командой/процессом, но и другие ресурсы, такие как память, ввод-вывод и вызовы IPC.

Типичный синтаксис команды Time:

«Параметры» в приведенном выше синтаксисе относятся к набору флагов, которые можно использовать с командой времени для выполнения определенной функции. Список доступных опций приведен ниже.

  • -f , --format — используйте этот параметр, чтобы указать желаемый формат вывода.
  • -p , --portability — использовать переносимый формат вывода.
  • -o файл, --output =ФАЙЛ – записывает вывод в ФАЙЛ вместо стандартного вывода.
  • -a , --append – добавить вывод в ФАЙЛ, а не перезаписать его.
  • -v , --verbose — этот параметр отображает подробное описание выходных данных утилиты «время».
  • --quiet – этот параметр запрещает утилите time сообщать о состоянии программы.

При использовании программы 'GNU time' без каких-либо опций вы увидите примерно такой результат, как показано ниже.

Если вы запустите ту же команду со встроенным ключевым словом 'time', вывод будет немного другим:

В некоторых случаях вам может понадобиться записать вывод об использовании системных ресурсов в файл, а не отображать его в Терминале. Для этого используйте флаг -o, как показано ниже.

Как видно из выходных данных, утилита Time не отображает выходные данные. Потому что мы записываем вывод в файл с именем file.txt. Давайте посмотрим на этот файл:

Если вы используете флаг -o, если нет файла с именем 'file.txt', он создаст и запишет в него выходные данные. Если файл .txt уже существует, он перезапишет его содержимое.

Вы также можете добавить выходные данные в файл вместо его перезаписи с помощью флага -a.

Флаг -f позволяет пользователям управлять форматом вывода по своему вкусу. Скажем, например, следующая команда отображает вывод команды « ls » и показывает только пользователя, систему и общее время.

Обратите внимание, что встроенная команда командной оболочки time не поддерживает все функции программы GNU time.

Команда time в Linux используется для определения продолжительности выполнения команды. Эта команда полезна, когда вы хотите узнать время выполнения команды или скрипта. По умолчанию отображаются три раза:

  • реальное время — общее время выполнения. Это время, прошедшее между вызовом и завершением команды.
  • время ЦП пользователя — время ЦП, используемое вашим процессом.
  • время ЦП системы — время ЦП, используемое системой от имени вашего процесса.

Вот пример. Следующая команда сообщит, сколько времени ушло на выполнение команды find ./* -name “*file*”:

Команду time также можно использовать для отслеживания времени выполнения скриптов:

  • Обзор
  • Установка
  • Оболочка
  • Редактирование текста
  • Управление процессами
  • Установка приложений
  • Управление пользователями
  • Управление группами
  • Разрешения
  • Управление оборудованием
  • Загрузить Linux
  • Сетевые протоколы
  • Основы работы в сети
  • Сетевые инструменты
  • Обзор файловых систем
  • Разметка диска
  • Настроить жесткие диски
  • Настройка дисковых квот
  • Ведение журнала
  • Планирование заданий
  • Дата и время
  • Электронная почта
  • Сценарии оболочки
  • Разное

сообщить об этом объявлении

Я хочу выполнить что-то в оболочке Linux при нескольких разных условиях и иметь возможность выводить время выполнения каждого выполнения.

Я знаю, что могу написать скрипт на Perl или Python, который сделает это, но есть ли способ сделать это в оболочке? (который оказался bash)

10 ответов 10

Используйте встроенное ключевое слово времени:

Как это используется в такой команде, как time -p i=x; при чтении строки; сделать х=х; Готово ? Он немедленно возвращает 0,00, если я ничего не добавляю перед циклом while... что дает?

@natli: Хотя time может синхронизировать весь конвейер как есть (в силу того, что это ключевое слово в Bash), вам необходимо использовать групповую команду ( < . ; . ; >) для определения времени нескольких команд: time -p < i=x; при чтении строки; сделать х=х; готово

Вы можете получить гораздо более подробную информацию, чем встроенное время bash (то есть время (1), которое упоминает Роберт Гэмбл). Обычно это /usr/bin/time .

Примечание редактора: чтобы убедиться, что вы вызываете время внешней утилиты, а не ключевое слово вашей оболочки, вызовите его как /usr/bin/time . time является утилитой, обязательной для POSIX, но единственный параметр, который требуется для поддержки, это -p . На определенных платформах реализованы определенные нестандартные расширения: -v работает с утилитой времени GNU, как показано ниже (вопрос помечен как linux); реализация BSD/macOS использует -l для получения аналогичного вывода — см. man 1 раз .

Пример подробного вывода:

Вы случайно не знаете, из какого пакета debian это будет? похоже, он не установлен по умолчанию

Я ссылался на ваш пост, Роберт. Если вы не имеете в виду, что предлагаемая вами команда не является встроенной в bash?

Выход из /usr/bin/time выглядит так: "0.00user 0.00system 0:02.00elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+172minor)pagefaults 0swaps"

Есть гораздо более простой способ. Bash автоматически вычисляет специальную переменную $SECONDS , тогда пересчет на основе внешней команды даты не требуется. Переменная $SECONDS хранит, сколько секунд выполняется скрипт bash при его запуске. Эта переменная имеет особое свойство. См. справочную страницу: D

Я пробовал как описанный выше, так и метод, описанный в комментарии. В первом случае я получаю сообщение об ошибке "недопустимая переменная", а во втором - "неопознанная переменная"

Для построчного измерения дельты попробуйте gnomon.

Утилита командной строки, немного похожая на ts из moreutils, для добавления информации о метке времени к стандартному выводу другой команды.Полезно для длительных процессов, когда вам нужен исторический отчет о том, что занимает так много времени.

Вы также можете использовать параметры --high и/или --medium, чтобы указать порог длины в секундах, при превышении которого gnomon будет выделять отметку времени красным или желтым цветом. И вы также можете сделать несколько других вещей.

Отличный совет, но для ясности: это полезно для построчного тайминга, но накладные расходы, связанные с таким точным таймингом, значительно увеличивают общие результаты время.

Если вам нужна более высокая точность, используйте %N с датой (и используйте bc для сравнения, поскольку $(()) обрабатывает только целые числа).

Вот как это сделать:

Если вы собираетесь использовать время позже для вычислений, узнайте, как использовать параметр -f в /usr/bin/time для вывода кода, который экономит время. Вот некоторый код, который я недавно использовал для получения и сортировки времени выполнения целого класса студенческих программ:

Позже я объединил все файлы $timefile и передал вывод в интерпретатор Lua. Вы можете сделать то же самое с Python или bash или с любым вашим любимым синтаксисом. Мне нравится эта техника.

Примечание. Полный путь /usr/bin/time необходим, потому что, хотя какое время говорит вам об обратном, если вы просто запустите time , будет запущена версия времени вашей оболочки, которая не принимает никаких аргументов.

Если вам нужна точность только до секунды, вы можете использовать встроенную переменную $SECONDS, которая подсчитывает количество секунд, в течение которых работает оболочка.

Вы можете использовать время и подоболочку () :

Или в той же оболочке <> :

@StasBekman не соответствует действительности, сначала используется ( & ) (новый контекст, подоболочка), а затем используется < & >(та же оболочка, тот же контекст)

Ага! Я внимательно присматривался к этим двум и не увидел разницы. Спасибо, что разъяснили, что <> vs ().

Нет необходимости использовать теги -lphtread или -o. Просто нужно использовать команду времени, которая лучше объясняет принятый ответ.

Это был пример. У моего Perform.c есть многопоточность, поэтому мне нужен -lpthread, а для простой идентификации это -o per.

одним из возможных простых методов (который может не соответствовать потребностям разных пользователей) является использование оболочки PROMPT. Это простое решение, которое может оказаться полезным в некоторых случаях. Вы можете использовать функцию подсказок bash, как показано в примере ниже:

Приведенная выше команда изменит приглашение оболочки на:

Каждый раз, когда вы запускаете команду (или нажимаете Enter), возвращаясь к командной строке, в ней будет отображаться текущее время.

примечания:
1) имейте в виду, что если вы ждали некоторое время, прежде чем вводить следующую команду, то это время необходимо учитывать, т. е. время, отображаемое в приглашении оболочки, является отметкой времени, когда отображалось приглашение оболочки. , а не при вводе команды. некоторые пользователи предпочитают нажимать клавишу Enter, чтобы получить новое приглашение с новой отметкой времени, прежде чем они будут готовы к следующей команде.
2) Существуют другие доступные параметры и модификаторы, которые можно использовать для изменения командной строки bash, см. ( man bash ) для получения более подробной информации.

Я хочу отображать время выполнения скрипта.

В настоящее время я делаю следующее:

Это просто показывает время начала и окончания сценария. Можно ли отображать детализированные выходные данные, такие как время процессора/время ввода-вывода и т. д.?

@CiroSantilli烏坎事件2016六四事件法轮功 Я думаю, что предложенная вами ветка по-прежнему недостаточна для устранения влияния временных событий.

Есть команда, которую вы можете запустить, а затем она автоматически запускает все команды unix, забыли, как это включить?

19 ответов 19

Просто используйте время при вызове скрипта:

а "реальное", вероятно, то, что люди хотят знать - "Реальное время настенных часов - время от начала до конца звонка"

Если времени нет,

или, если вам нужна точность до доли секунды и у вас установлен bc,

Обратите внимание, что это работает, только если вам не нужна точность до доли секунды. Для некоторых целей это может быть приемлемо, для других нет. Для немного большей точности (например, вы по-прежнему вызываете дату дважды, так что вы могли бы лучше всего получить точность в миллисекундах на практике, а возможно и меньше), попробуйте использовать date +%s.%N . ( %N – это наносекунды, начиная с целой секунды.)

@ChrisH О. Хорошо, указывая на это; арифметическое расширение bash возможно только для целых чисел. Я вижу два очевидных варианта; либо отбросьте период в строке формата даты (и обработайте результирующее значение как наносекунды с начала эпохи), поэтому используйте date +%s%N , либо используйте что-то более способное, например bc, чтобы вычислить фактическое время выполнения из двух значений, как предлагает jwchew. Тем не менее, я считаю, что этот подход является неоптимальным; время значительно лучше, если оно доступно, по причинам, изложенным выше.

В дополнение к комментарию @rubo77, если ваш скрипт занимает несколько часов, используйте hours=$((runtime / 3600)); минуты=$(((время выполнения % 3600)/60)); секунд=$(( (время выполнения % 3600) % 60 )); echo "Время выполнения: $часы:$минуты:$секунды (чч:мм:сс)"

Просто вызовите время без аргументов после выхода из скрипта.

С ksh ​​или zsh вместо этого вы также можете использовать время. При использовании zsh time также будет отображать время настенных часов в дополнение к процессорному времени пользователя и системы.

Чтобы сохранить статус завершения вашего скрипта, вы можете сделать это:

Или вы также можете добавить ловушку на ВЫХОД:

Таким образом, время будет вызываться при выходе из оболочки, и статус выхода будет сохранен.

Также обратите внимание, что все bash , ksh и zsh имеют специальную переменную $SECONDS, которая автоматически увеличивается каждую секунду. Как в zsh, так и в ksh93 эта переменная также может быть сделана с плавающей запятой (с набором -F SECONDS ), чтобы получить большую точность. Это только время настенных часов, а не процессорное время.

Устраняет ли ваш подход влияние временных событий? - Я думаю, что ваш подход близок к подходу, представленному ранее. - - Я думаю, что подход timeit, представленный в коде MATLAB, может быть здесь полезен.

Привет, @Stéphane Chazelas. Я обнаружил, что время не дает времени стены, верно? например, bash -c 'время прерывания EXIT;sleep 2'

@Binarus, да, эта функция исходит от ksh. В отличие от ksh93/zsh, помимо того, что bash не поддерживает плавающую точку, он также сломан в том, что после того, как вы установите SECONDS в 0, он изменится на 1 с 0 на 1 секунду позже (поскольку он учитывает только результат time(), который имеет только полная секундная детализация).

Большое спасибо за подсказку. Таким образом, в bash требуется не менее одной секунды и не более двух секунд, пока он не изменится на 1 после установки его на 0. Однако я думаю, что это не нарушит чьи-либо сценарии, потому что ни один разумный человек не будет использовать средство измерения с 1 с разрешение для измерения промежутков времени в одну или две секунды. Я обычно использую его для проверки промежутков времени в 30 секунд и более, и там, где не важно, 31 это или 29 секунд на самом деле. Но еще раз большое спасибо за то, что вы обратили наше внимание на это тонкое и очень интересное различие между различными оболочками.

Я немного опоздал на подножку, но хотел опубликовать свое решение (с точностью до секунды) на случай, если другие случайно наткнутся на эту ветку через поиск. Выходные данные представлены в формате дней, часов, минут и, наконец, секунд:

Надеюсь, кому-то это будет полезно!

[edit] Вам нужно подсчитать все символы в определении поля в bash printf, если вы хотите, чтобы секунды дополнялись до 2 цифр перед точкой, вы должны определить ее как% 07.4f (все цифры и точки также учитываются в поле длины) поэтому строка должна выглядеть так: LC_NUMERIC=C printf "Общее время выполнения: %d:%02d:%02d:%07.4f\n" $dd $dh $dm $ds

Я думаю, что нет другого (только bash) способа, кроме использования 'bc' для выполнения вычислений. Кстати, действительно хороший сценарий ;)

Остерегайтесь того, что дата FreeBSD не поддерживает точность до доли секунды и просто добавляет литерал « N » к метке времени.

Очень хороший скрипт, но мой bash не обрабатывает доли секунды. Я также узнал, что /1 в bc эффективно удаляет это, поэтому я добавил @/1@ к вычислению $ds, и теперь он очень хорошо отображает вещи!

bc поддерживает модуль: dt2=$(echo "$dt%86400" | bc) . Просто говорю. Кстати, я предпочитаю форму dt2=$(bc, но это сугубо личное.

Я пока ничего не знаю о bc, но деление на 86400 вызывает у меня недоверие по следующей причине: есть дни, в которых нет 86400 секунд, например дни, когда время переключается с летнего времени на нормальное время и наоборот наоборот, или дни с дополнительными секундами. Если такие дни являются частью промежутка времени, который вы хотите вычислить, т. е. находятся между res1 и res2 (включая эти значения), ваш скрипт, вероятно, не будет работать.

Мой метод для bash:

Это показывает прошедшее время, но не показывает "детализированные выходные данные, такие как время процессора, время ввода-вывода", как запрошено в вопросе.

Тем, кто ищет ответ на поставленный вопрос, скорее всего, это решение покажется полезным. Ваш комментарий лучше адресовать вопросу ОП.

Почему в начале необходимо установить значение SECONDS равным 0? Читая об этом, кажется, что он начинается с 0 при запуске скрипта. Если вы хотите рассчитать время всего сценария, можете ли вы спокойно пропустить эту строку?

Лично мне нравится заключать весь код скрипта в какую-нибудь "основную" функцию, например так:

Обратите внимание, как легко использовать команду времени в этом сценарии. Очевидно, вы не измеряете точное время, включая время синтаксического анализа скрипта, но я нахожу его достаточно точным в большинстве ситуаций.

Это лучшее решение. единственная проблема в том, что вы не можете получить доступ к аргументам скрипта из main .Чтобы передать аргументы функции, вам нужно вызвать time main "$@" в последней строке

Этот вопрос довольно старый, но в попытке найти мой любимый способ сделать это эта ветка поднялась высоко. и я удивлен, что никто не упомянул об этом:

perf — это инструмент для анализа производительности, включенный в ядро ​​в разделе tools/perf и часто доступный для установки в виде отдельного пакета («perf» в CentOS и «linux-tools» в Debian/Ubuntu). В Linux Kernal perf Wiki есть гораздо больше информации об этом.

Запуск 'perf stat' дает довольно много подробностей, включая среднее время выполнения в самом конце:

perf stat теперь жалуется на сообщение "Возможно, у вас нет разрешения на сбор статистики". если вы не запустите некоторые команды с помощью sudo , что делает его бесполезным во всех сценариях, где вы не полностью владеете целевой машиной.

Потрясающе, спасибо! Намного более детальное решение, чем время, которое предлагают другие. В частности, время не применимо к измерению решений для конкуренции за код (поскольку оно не печатает время в миллисекундах и меньше), в отличие от вашего решения.

Да, это вызывает Python, но если вы можете смириться с этим, то это довольно хорошее и лаконичное решение.

Учтите, что запуск этой команды python в подоболочке и чтение ее вывода займет несколько миллионов наносекунд в большинстве современных систем. То же самое для текущей даты .

"Несколько миллионов наносекунд" означает несколько миллисекунд. Люди, синхронизирующие bash-скрипты, обычно не очень беспокоятся об этом (если только они не запускают несколько миллиардов скриптов в мегасекунду).

Обратите также внимание, что, даже если вычисления выполняются внутри процесса Python, значения полностью собираются до вызова Python. Время выполнения скрипта будет измерено корректно, без лишних «миллионов наносекунд».

time main выше намного чище. да, мы можем жить с большим количеством деградации, но без нее намного лучше, так что давайте останемся инженерами!

Небольшая функция оболочки, которую можно добавить перед командами для измерения их времени:

Затем используйте его в своем скрипте или в командной строке следующим образом:

Чем это действительно отличается от других уже данных ответов, которые используют дату до и после сценария и выводят разницу между ними?

Какая красивая вещь. Вы можете поместить после него любую команду, и она выведет результат в приятном, удобочитаемом виде. Мне очень нравится использовать его для временных сборок. Пример:

<р>. или для операций git, которые потенциально могут быть очень длинными, поэтому я могу развить реалистичные мыслительные ожидания:

Для более настраиваемого времени, когда вам может потребоваться манипулировать выводом или преобразовать его в другие формы, в bash используйте внутреннюю переменную $SECONDS. Вот демонстрация, включающая преобразование этих секунд в другие единицы, например минуты с плавающей запятой:

Обратите внимание, что dt_min округляется от 0,01666666666. (1 секунда = столько минут) до 0,017 в данном случае, так как я использую функцию printf для округления. Сон 1; часть ниже - это то, где вы бы вызвали свой скрипт для запуска и времени, но вместо этого я просто сплю в течение 1 секунды ради этой демонстрации.

По теме:

Используя только bash, также можно измерить и рассчитать продолжительность времени для части сценария оболочки (или истекшее время для всего сценария):

теперь вы можете либо просто напечатать разницу:

если вам нужна только дополнительная продолжительность, сделайте следующее:

Вы также можете сохранить продолжительность в переменной:

^ ЭТО ответ, ребята. Или проще: $SECONDS в конце. Это ВСТРОЕННАЯ переменная Bash. Все остальные ответы просто делают дополнительную работу, чтобы заново изобрести это колесо.

Функция синхронизации на основе SECONDS , ограниченная только степенью детализации второго уровня, не использует никаких внешних команд:

Использовать встроенное время bash?

Принятое решение с использованием времени записывает в stderr .
Решение, использующее время, записывает данные в стандартный вывод.
В решениях, использующих $SECONDS, отсутствует точность до доли секунды.
Другие решения включают вызов внешних программ, таких как date или perf, что неэффективно.
Если вас устраивает любой из них, используйте его.

Но если вам нужно эффективное решение для получения времени с точностью до миллисекунды и необходимости его в переменных, чтобы исходный вывод оставался нетронутым, вы можете комбинировать подстановку процесса с некоторыми перенаправлениями по времени, что намного быстрее, чем вызов внешних программ и позволяет перенаправления вокруг скрипта временной оболочки, как в исходной команде/скрипте.

Выберите один из следующих вариантов анализа вывода времени в соответствии с вашими потребностями:
Самый короткий вариант, в котором стандартный вывод $Cmd записывается в стандартный вывод и ничего не записывается в стандартный вывод:

Более длинный вариант, в котором исходный stdout и stderr отделены друг от друга:

Самый сложный вариант включает в себя закрытие дополнительных файловых дескрипторов, так что $Cmd вызывается как бы без этой временной оболочки вокруг него, а команды lvm, такие как vgs, не жалуются на утечку файловых дескрипторов:

Вы даже можете подделать сложение с плавающей запятой в bash, не вызывая bc, что было бы намного медленнее:

Читайте также: