Как измерить продолжительность в секундах в сценарии оболочки? - PullRequest
70 голосов
/ 01 марта 2011

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

Ответы [ 7 ]

100 голосов
/ 01 марта 2011

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

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

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

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

39 голосов
/ 01 марта 2011

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

34 голосов
/ 05 мая 2011

Попробуйте следующий пример:

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
5 голосов
/ 10 марта 2019

Во многих ответах упоминается $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."
5 голосов
/ 24 марта 2015

Вот скрипт для поиска времени, прошедшего в миллисекундах. Замените строку сна 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
3 голосов
/ 19 января 2012

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

 arithmetic expression: expecting primary: "-"

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

#!/bin/bash

Ура!

1 голос

GNU 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.

    Это часточто я хочу, когда бенчмаркинг: одно число, а не минуты + секунды.

И важный шаблон, который я часто использую:.

Вывод:

cmd sleep 1
time 1.00

cmd sleep 2
time 2.00

cmd sleep 3
time 3.00

Объяснение:

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

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

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

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

...