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

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


person yazz.com    schedule 01.03.2011    source источник


Ответы (7)


Использование команды времени, как предлагали другие, является хорошей идеей.

Другой вариант — использовать волшебную встроенную переменную $SECONDS, которая содержит количество секунд, прошедших с начала выполнения скрипта. Ты можешь сказать:

START_TIME=$SECONDS
dosomething
ELAPSED_TIME=$(($SECONDS - $START_TIME))

Я думаю, что это специфично для bash, но, поскольку вы работаете в Linux, я предполагаю, что вы используете bash.

person Tom Anderson    schedule 01.03.2011
comment
Единственное предостережение, которое я хотел бы здесь добавить, заключается в том, что использование имен ваших собственных переменных, написанных заглавными буквами, является дурным тоном, поскольку это означает, что вы можете по ошибке перезаписать встроенные в оболочку переменные (например, если кто-то присваивает SECONDS, он перестает иметь свое значение). особое значение). См. спецификацию POSIX @ pubs.opengroup.org/onlinepubs/9699919799/basedefs/, зарезервировав строчные буквы для использования приложением, учитывая, что переменные оболочки и среды имеют одно пространство имен -- Пространство имен имен переменных среды, содержащих буквы нижнего регистра, зарезервировано для приложений. - person Charles Duffy; 14.03.2019

Используйте команду time. time ls /bin.

person Keith    schedule 01.03.2011
comment
time не подходит при выполнении сложной последовательности команд - person Shiplu Mokaddim; 26.12.2013
comment
@shiplu.mokadd.im Нет? Как насчет: time (ls / ; sleep 2; ls /bin). - person Keith; 26.12.2013
comment
Если вы используете \ и (), это становится более сложным. - person Shiplu Mokaddim; 26.12.2013
comment
@shiplu.mokadd.im - почему не подходит? Объяснять. Мне кажется, что все в порядке / точно, и я использую в течение многих лет ... - person B. Shea; 23.05.2016
comment
@Keith У этого есть некоторые проблемы, например, /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
person Wolfram Aulenbach    schedule 05.05.2011

Во многих ответах упоминается $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."
person Tammer Saleh    schedule 10.03.2019

Вот скрипт, чтобы найти прошедшее время в миллисекундах. Замените строку 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
person user3300239    schedule 24.03.2015

Просто чтобы помочь любому, как я, получающему сообщение об ошибке:

 arithmetic expression: expecting primary: "-"

Проверьте свой шеллскрипт, который должен начинаться с:

#!/bin/bash

Ваше здоровье!

person rafa.ferreira    schedule 19.01.2012

ГНУ 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

GitHub upstream.

Выход:

cmd sleep 1
time 1.00

cmd sleep 2
time 2.00

cmd sleep 3
time 3.00

Объяснение:

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

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

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

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

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 15.06.2019