Unix에서 스크립트 실행 진행률을 표시하는 방법은 무엇입니까?

Unix에서 스크립트 실행 진행률을 표시하는 방법은 무엇입니까?

Perl이나 tcl과 같은 일부 스크립트를 실행한다고 가정해 보겠습니다. 예를 들어, $ ./script.sh; ./script.pl; source script.tcl. 실행하고 프롬프트로 돌아가는 데 시간이 걸립니다. 실행하는 동안 실행 비율을 표시하는 방법은 무엇입니까?

아래에서 샘플 UI를 찾을 수 있습니다. 마지막으로 스크립트의 실행 시간을 보여줍니다.

1% Completed the exectuion of script.pl
2% Completed the exectuion of script.pl
. . . .
100% Completed the the exectuion of script.pl

Ex: Execution time for script.pl is :50 Seconds

답변1

다음 스크립트는 다음을 보여줍니다.

  1. 현재 프로젝트(반복) 번호
  2. 슬라이딩 윈도우 평균 속도(예: 10회 반복 평균)
  3. 전체 평균 비율
  4. 지금까지의 진행률(관개 횟수를 알고 있는 경우)

산출:

317:  window: 3.76/s   overall: 3.28/s   progress: 31.7%

테스트 파일:

set test_file
# create a test file
for i in {1..1000} ;do echo $i; done >"$1"

스크립트:

if="$1"             # the input file
lct=$(wc -l <"$if") # number of lines in input file
tot=${lct:-0}       # total number of itterations; If unknown, default is 0
                    #+  The total is know in this case. '$tot' is just a rough 
                    #+  example of how to suppress the progress %age output
beg=$(date +%s.%N)  # starting unix time.%N is nanoseconds (a GNU extension)
swx=10              # keep a sliding window of max 'n' itteratons (to average)
unset sw            # an array of the last '$swx' rates
for i in $(seq 1 $lct) ;do
    sw[$i]=$(date +%s.%N)  # sliding window start time
    # ================                   
      sleep .$RANDOM       #  ... process something here
    # ================
    now=$(date +%s.%N)     # current unix time
    if ((i<=swx)) ;then
        sw1=1              # first element of sliding window  
        sww=$i             # sliding window width (starts from 1)
    else
        sw1=$((i-swx+1))
        sww=$swx        
    fi
    bc=($(bc <<<"scale=2; $i/($now-$beg); $sww/($now-${sw[$sw1]})"))
    oavg=${bc[0]}                  # overall average rate
    swhz=${bc[1]}                  # sliding window rate
    ((i>swx)) && unset sw[$sw1-1]  # remove old entry from sliding window list
    ((tot==0)) && pc= || pc="progress: $(bc <<<"scale=1; x=($i*100)/$tot; if (x<1) print 0; x")%"
    msg="$i:  window: $swhz/s   overall: $oavg/s   $pc"
    printf "\r%"$((${#i}+1))"s=\r%s" "" "$msg"
done

관련 정보