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


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

root@hostname:~# "command to execute" && echo "execution time"
8 72

8 ответов:

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

строение time всегда печатает в stderr, но /usr/bin/time позволит вам отправлять выходные данные time в определенный файл, поэтому вы не вмешиваетесь в поток stderr выполняемой команды. Кроме того,/usr/bin/timeформат настраивается в командной строке или by переменная окружения TIME, в то время как Баш построен и только настроить 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

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
root@hostname:~# time [command]

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

для построчного измерения дельты, попробовать gnonom.

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

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

gnomon demo

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

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

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`

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

$ 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>"