Печать времени выполнения команды оболочки

88

Можно ли распечатать время выполнения команды оболочки с помощью следующей комбинации?

root@hostname:~# "command to execute" && echo "execution time"
Джек
источник

Ответы:

72

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

Встроенная команда timeвсегда печатает в stderr, но /usr/bin/timeпозволяет отправлять вывод времени в конкретный файл, чтобы вы не мешали потоку исполняемой команды stderr. Кроме того, /usr/bin/timeформат настраивается в командной строке или с помощью переменной среды TIME, тогда как встроенный timeформат bash настраивается только с помощью TIMEFORMATпеременной среды.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
Марк Рушаков
источник
From man bash: «Переменная TIMEFORMAT может быть установлена ​​в строку формата, которая определяет, как должна отображаться информация о времени»
Приостановлено до дальнейшего уведомления.
К сожалению, я думал, что есть способ отформатировать его, но я пропустил его, help timeпотому что я только взглянул на него и подумал, что это аргумент командной строки. Обновлю ответ.
Марк Рушаков 01
2
Вот и прошло 9 лет, и команда заняла всего 0 мин. 0,018 с. Я просто подумал, что укажу на это.
Ghassen Louhaichi
112

time - это встроенная команда в большинстве оболочек, которая записывает информацию о времени выполнения на tty.

Вы также можете попробовать что-то вроде

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

Или в bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
толпа
источник
По согласованию с Маазой, такая гибкость позволила мне измерить время выполнения целого набора команд.
Nath
Можно ли применить аспекты Linux к любой команде Linux для расчета выполнения
Сайед Мазрина
1
Одним из недостатков этого подхода является то, что он измеряется в секундах, тогда как timeиспользует миллисекунды. И если вы хотите синхронизировать несколько команд вместе без использования переменных и вычислений, вы можете использовать круглые скобки: time ( command1 ; command2 ; command3 )вы можете даже синхронизировать их по отдельности вместе с общим временем, например: time ( time command1 ; time command2 ; time command3 ) Конечно, если вам нужно около двадцати команд, может лучше использовать это решение ответа. Но тогда вы должны начать думать о класть ваши команды все в сценарии ...
MSB
25
root@hostname:~# time [command]

Он также различает используемое время в реальном времени и используемое системное время.

Джейсон
источник
Это, безусловно, основной ответ, но есть некоторые сложности, если вы хотите увидеть вывод ошибки из команды и все же отправить информацию о времени на стандартный вывод, как это делает вопрос. Команда time записывает в stderr. То, что вы предлагаете, вероятно, достаточно точное - отсюда и мой +1.
Джонатан Леффлер,
2
timeпишет на tty, а не на stderr. Что, я думаю, только усугубляет ситуацию.
моб
12

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

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

При передаче чего-либо в gnomon к каждой строке добавляется временная метка, указывающая, как долго эта строка была последней строкой в ​​буфере, то есть сколько времени потребовалось для появления следующей строки. По умолчанию gnomon будет отображать секунды, прошедшие между каждой строкой, но это можно настроить.

гномон демо

Янус Троельсен
источник
8

Добавление к ответу @mob:

Добавление %Nк date +%sдает нам наносекундную точность:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`
навигация
источник
5

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

$ date; sha1sum reallybigfile.txt; date

В результате получится следующий результат:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

Конечно, в том виде, в каком он реализован здесь, он не очень точен и не рассчитывает прошедшее время. Но это грязно просто и иногда все, что вам нужно.

Итан
источник
4

В zsh вы можете использовать

=time ...

В bash или zsh вы можете использовать

command time ...

Они (с помощью различных механизмов) заставляют использовать внешнюю команду.

überRegenbogen
источник
0

Только ps -o etime= -p "<your_process_pid>"

Алехандро Галера
источник