Подтвердить что ты не робот

Как измерить продолжительность в секундах в сценарии оболочки?

Я хочу узнать, сколько времени занимает операция в оболочке Linux script. Как я могу это сделать?

4b9b3361

Ответ 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

GitHub вверх по течению.

Выход:

cmd sleep 1
time 1.00

cmd sleep 2
time 2.00

cmd sleep 3
time 3.00

Объяснение:

  • --output: вывод времени в файл.

    По умолчанию выходные данные отправляются в stderr, поэтому этот параметр важен для ветки синхронизации от stderr команды.

  • --append: добавить в файл вместо перезаписи.

    Это позволяет мне сконцентрировать весь вывод теста в одном файле.