Можно ли распечатать время выполнения команды оболочки с помощью следующей комбинации?
root@hostname:~# "command to execute" && echo "execution time"
Ответы:
Не забывайте, что существует разница между встроенной функцией 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
help time
потому что я только взглянул на него и подумал, что это аргумент командной строки. Обновлю ответ.
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
time
использует миллисекунды. И если вы хотите синхронизировать несколько команд вместе без использования переменных и вычислений, вы можете использовать круглые скобки: time ( command1 ; command2 ; command3 )
вы можете даже синхронизировать их по отдельности вместе с общим временем, например: time ( time command1 ; time command2 ; time command3 )
Конечно, если вам нужно около двадцати команд, может лучше использовать это решение ответа. Но тогда вы должны начать думать о класть ваши команды все в сценарии ...
root@hostname:~# time [command]
Он также различает используемое время в реальном времени и используемое системное время.
time
пишет на tty, а не на stderr. Что, я думаю, только усугубляет ситуацию.
Для построчного измерения дельты попробуйте gnonom .
Это утилита командной строки, немного похожая на ts moreutils, которая добавляет информацию о временной метке к стандартному выводу другой команды. Полезно для длительно выполняемых процессов, когда вы хотите иметь исторические записи о том, что занимает так много времени.
При передаче чего-либо в gnomon к каждой строке добавляется временная метка, указывающая, как долго эта строка была последней строкой в буфере, то есть сколько времени потребовалось для появления следующей строки. По умолчанию gnomon будет отображать секунды, прошедшие между каждой строкой, но это можно настроить.
Если я запускаю длительный процесс, такой как копия или хеш, и хочу позже узнать, сколько времени это заняло, я просто делаю следующее:
$ date; sha1sum reallybigfile.txt; date
В результате получится следующий результат:
Tue Jun 2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0 reallybigfile.txt
Tue Jun 2 21:33:54 PDT 2015
Конечно, в том виде, в каком он реализован здесь, он не очень точен и не рассчитывает прошедшее время. Но это грязно просто и иногда все, что вам нужно.
В zsh вы можете использовать
=time ...
В bash или zsh вы можете использовать
command time ...
Они (с помощью различных механизмов) заставляют использовать внешнюю команду.
Только ps -o etime= -p "<your_process_pid>"
man bash
: «Переменная TIMEFORMAT может быть установлена в строку формата, которая определяет, как должна отображаться информация о времени»