Я хочу узнать, сколько времени занимает операция в оболочке Linux script. Как я могу это сделать?
Как измерить продолжительность в секундах в сценарии оболочки?
Ответ 1
Использование команды времени, как предложили другие, является хорошей идеей.
Другой вариант - использовать волшебную встроенную переменную $SECONDS, которая содержит количество секунд с момента запуска script. Вы можете сказать:
START_TIME=$SECONDS
dosomething
ELAPSED_TIME=$(($SECONDS - $START_TIME))
Я думаю, что это bash -специфичный, но поскольку вы работаете в Linux, я предполагаю, что вы используете bash.
Ответ 2
Используйте команду time
. time ls /bin
.
Ответ 3
Попробуйте следующий пример:
START_TIME=$SECONDS
# do something
sleep 65
ELAPSED_TIME=$(($SECONDS - $START_TIME))
echo "$(($ELAPSED_TIME/60)) min $(($ELAPSED_TIME%60)) sec"
#> 1 min 5 sec
Ответ 4
Вы можете использовать команду "время". Просто добавьте "время" перед командой, которую вы хотите измерить продолжительностью. (Источник: http://unixhelp.ed.ac.uk/CGI/man-cgi?time)
Ответ 5
Во многих ответах упоминается $SECONDS
, но эта переменная даже лучше, чем они думают:
Присвоение этой переменной сбрасывает счет до присвоенного значения, и расширенное значение становится присвоенным значением плюс количество секунд с момента присвоения.
Это означает, что вы можете просто запросить эту переменную непосредственно в конце вашего скрипта, чтобы вывести истекшее время:
#!/usr/bin/env bash
# Do stuff...
echo "Script finished in $SECONDS seconds."
Вы также можете рассчитать меньшие разделы, например, так:
#!/usr/bin/env bash
# Do stuff
SECONDS=0
# Do timed stuff...
echo "Timed stuff finished in $SECONDS seconds."
Ответ 6
Вот script, чтобы найти время, прошедшее в миллисекундах. Замените линию сна 60 кодом, который вы хотите выполнить.
a=0
while [ $a -lt 10 ]
do
START_TIME=`echo $(($(date +%s%N)/1000000))`
sleep 3
END_TIME=`echo $(($(date +%s%N)/1000000))`
ELAPSED_TIME=$(($END_TIME - $START_TIME))
echo $ELAPSED_TIME
if [ $a -eq 10 ]
then
break
fi
a=`expr $a + 1`
done
Ответ 7
Просто чтобы помочь кому-то вроде меня получить сообщение об ошибке:
arithmetic expression: expecting primary: "-"
Проверьте свой shellscript, который должен начинаться с:
#!/bin/bash
Ура!
Ответ 8
time
GNU
Я также большая забава ГНУ time
команды: https://www.gnu.org/software/time/, который предлагает некоторые важные параметры по сравнению с time
Баш встроенной.
Пример использования:
env time --format '%e' --output time.log sleep 1
Выход:
1.00
Объяснение:
-
env
: найти/usr/bin/time
вместо встроенного в Bash -
--format '%e'
: время печати в секундах, см.man time
.Часто это то, что я хочу при тестировании: одно число, а не минуты + секунды.
И важный шаблон, который я часто использую:
bench-cmd() (
logfile=time.log
echo "cmd [email protected]" >> "$logfile"
printf 'time ' >> "$logfile"
bench_cmd="env time --append --format '%e' --output '$logfile' [email protected]"
eval "$bench_cmd"
echo >> "$logfile"
)
rm -f time.log
bench-cmd sleep 1
bench-cmd sleep 2
bench-cmd sleep 3
cat time.log
Выход:
cmd sleep 1
time 1.00
cmd sleep 2
time 2.00
cmd sleep 3
time 3.00
Объяснение:
-
--output
: вывод времени в файл.По умолчанию выходные данные отправляются в stderr, поэтому этот параметр важен для ветки синхронизации от stderr команды.
-
--append
: добавить в файл вместо перезаписи.Это позволяет мне сконцентрировать весь вывод теста в одном файле.