Я хочу узнать, сколько времени занимает операция в сценарии оболочки Linux. Как я могу это сделать?
Как измерить продолжительность в секундах в сценарии оболочки?
Ответы (7)
Использование команды времени, как предлагали другие, является хорошей идеей.
Другой вариант — использовать волшебную встроенную переменную $SECONDS, которая содержит количество секунд, прошедших с начала выполнения скрипта. Ты можешь сказать:
START_TIME=$SECONDS
dosomething
ELAPSED_TIME=$(($SECONDS - $START_TIME))
Я думаю, что это специфично для bash, но, поскольку вы работаете в Linux, я предполагаю, что вы используете bash.
SECONDS
, он перестает иметь свое значение). особое значение). См. спецификацию POSIX @ pubs.opengroup.org/onlinepubs/9699919799/basedefs/, зарезервировав строчные буквы для использования приложением, учитывая, что переменные оболочки и среды имеют одно пространство имен -- Пространство имен имен переменных среды, содержащих буквы нижнего регистра, зарезервировано для приложений.
- person Charles Duffy; 14.03.2019
Используйте команду time
. time ls /bin
.
time
не подходит при выполнении сложной последовательности команд
- person Shiplu Mokaddim; 26.12.2013
time (ls / ; sleep 2; ls /bin)
.
- person Keith; 26.12.2013
\
и ()
, это становится более сложным.
- person Shiplu Mokaddim; 26.12.2013
/usr/bin/time -f '%C => %E' (ls / ; sleep 2; ls /bin)
выбрасывает bash: syntax error near unexpected token '('
- person Shiplu Mokaddim; 01.07.2019
Попробуйте следующий пример:
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
Во многих ответах упоминается $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."
Вот скрипт, чтобы найти прошедшее время в миллисекундах. Замените строку sleep 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
Просто чтобы помочь любому, как я, получающему сообщение об ошибке:
arithmetic expression: expecting primary: "-"
Проверьте свой шеллскрипт, который должен начинаться с:
#!/bin/bash
Ваше здоровье!
ГНУ time
Мне также очень нравится команда GNU time
: https://www.gnu.org/software/time/, который предлагает несколько важных опций по сравнению со встроенным time
Bash.
Пример использования:
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 $@" >> "$logfile"
printf 'time ' >> "$logfile"
bench_cmd="env time --append --format '%e' --output '$logfile' $@"
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
: вывод времени в файл.По умолчанию вывод идет на стандартный вывод, поэтому этот параметр важен для отделения времени от стандартного вывода команды.
--append
: добавить в файл вместо перезаписи.Это позволяет мне сконцентрировать все выходные данные теста в одном файле.