program story

쉘 스크립트에서 기간을 초 단위로 측정하려면 어떻게합니까?

inputbox 2020. 10. 31. 09:39
반응형

쉘 스크립트에서 기간을 초 단위로 측정하려면 어떻게합니까?


Linux 셸 스크립트에서 작업에 걸리는 시간을 알고 싶습니다. 어떻게 할 수 있습니까?


다른 사람들이 제안한 것처럼 time 명령을 사용하는 것이 좋습니다.

또 다른 옵션은 스크립트 실행이 시작된 이후의 시간 (초)을 포함하는 매직 내장 변수 $ SECONDS를 사용하는 것입니다. 다음과 같이 말할 수 있습니다.

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

나는 이것이 bash 특정이라고 생각하지만 Linux를 사용하고 있으므로 bash를 사용하고 있다고 가정합니다.


time명령을 사용하십시오 . time ls /bin.


다음 예를 시도하십시오.

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/) 이 매우 재미 있습니다. 이것은 timeBash 내장에 비해 몇 가지 중요한 옵션을 제공합니다 .

샘플 사용법 :

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.

Output:

cmd sleep 1
time 1.00

cmd sleep 2
time 2.00

cmd sleep 3
time 3.00

Explanation:

  • --output: output the time to a file.

    By default, the output goes to stderr, so this option is important to separate the timing from the stderr of the command.

  • --append: append to the file instead of overwriting.

    This allows me to concentrate the entire benchmark output in a single file.

참고URL : https://stackoverflow.com/questions/5152858/how-do-i-measure-duration-in-seconds-in-a-shell-script

반응형