쉘 스크립트

쉘 스크립트

미사용 및 사용에 따른 진행상황 및 예상 작성시간sync

진행률을 표시하고 전체 쓰기 프로세스의 예상 시간 ETA(예상 도착 시간)를 추정하는 동안 버퍼를 플러시하는 도구(또는 쉬운 방법)를 찾지 못했습니다.

  • pv운영 체제에서 보는 대로 진행 시간을 표시하는 것이 가능하지만 대상 드라이브가 느리고 RAM이 많은 경우 데이터가 버퍼에 기록될 때까지의 시간만 표시합니다. 이 시간은 버퍼가 플러시되기 전 실제 시간의 일부일 수 있습니다.

  • dd사용된 데이터 양, 시간 및 전송 속도에 대한 최종 보고서를 준비합니다. 또한 "진행" 보고서를 작성하는 데에도 사용할 수 있습니다. 예전에는 그보다 더 나은 추정치를 제공했지만 pv이제는 USB 드라이브와 메모리 카드가 여전히 매우 느린 반면 다른 프로세스는 빠르고 사용 가능한 버퍼 메모리가 엄청납니다. 따라서 dd버퍼가 플러시되기 전에도 완료됩니다.

  • 명령 sync사용 을 포함하여 쓰기 과정의 "시간"을 측정할 수 있습니다.time

    time ( write command; sync )
    

    실제로 사용된 시간을 알려주므로 유용하지만 사용이 완료된 후에만 가능합니다. 진행 상황이 표시되지 않으며 남은 총 시간도 추정되지 않습니다.

  • 읽기 및 쓰기 진행 상황과 읽기 및 쓰기 속도를 표시하기 위해 실행할 수 있지만 iotop남은 시간은 추정되지 않습니다.

진행 상황 및 예상 시간을 표시하는 방법모두글쓰기 과정?

플러시 버퍼 사용을 포함하여 전체 쓰기 프로세스의 진행률과 예상 시간, ETA(예상 도착 시간)를 어떻게 표시합니까 sync?

관련 질문 링크

답변1

쉘 스크립트

사용 중에 보고된 "더러운" 데이터의 양에 대한 제안을 주신 @LinuxSecurityFreak에게 감사드립니다 /proc/meminfo.

나는 다음과 같은 쉘스크립트를 만들었다 flusher. 버퍼 플러시의 진행 상황과 예상 시간을 보여줍니다. 예를 들어 Linux 운영 체제에서 라이브 드라이브를 생성하기 위해 iso 파일에서 USB 드라이브 또는 메모리 카드로 복제한 후 사용할 수 있습니다.

#!/bin/bash

timeorig=$(date '+%s')
deltat=5  # checking time interval

dirtorig=$(grep -e 'Dirty:' /proc/meminfo | tr -s ' ' '\t' | cut -f2)
dirt0=$dirtorig
echo -n "dirty = $dirt0 kB - before sync"

sync & spid=$!

while ps -A|grep "$spid" > /dev/null
do
 sleep "$deltat"
 dirty=$(grep -e 'Dirty:' /proc/meminfo | tr -s ' ' '\t' | cut -f2)
 deltad=$((dirt0-dirty))
 if [ $deltad -gt 0 ]
 then
  eta="$((dirty*deltat/deltad)) s"
  rate="$(((deltad+500)/deltat/1000)) MB/s"
 else
  eta="n.a."
  rate="n.a."
 fi
 echo -en "\0033[2K\0033[1G"
 echo -n "dirty = $dirty kB -- syncing -- rate = $rate -- eta = $eta"
 dirt0="$dirty"
done
echo -e "\0033[2K\0033[1GDone syncing :-)"

timefinal=$(date '+%s')
timeused=$((timefinal-timeorig))
if [ $timeused -gt 0 ]
then
 rate="$(((10*dirtorig+5)/timeused/10))"
 if [ $rate -ge 10000 ]
 then
  rate="$(((dirtorig+500)/timeused/1000)) MB/s"
 else
  rate="$rate kB/S"
 fi
else
 rate="n.a."
fi
echo "syncing time = $timeused s -- rate = $rate"

데모 예시

느린 드라이브에 복제(USB 2)

$ sudo dd if=xubuntu-18.04.1-desktop-amd64.iso of=/dev/sde bs=1M ; ./flusher
[sudo] password for sudodus: 
1367+1 posts in
1367+1 posts ut
1434386432 bytes (1.4 GB, 1.3 GiB) copied, 0.408724 s, 3.5 GB/s

출력 flusher:

dirty = 840600 kB -- syncing -- rate = 5 MB/s -- eta = 156 s
...
Done syncing :-)
syncing time = 302 s -- rate = 4639 kB/S

빠른 드라이브로 복제(eSATA)

$ sudo dd if=xubuntu-18.04.1-desktop-amd64.iso of=/dev/sda bs=1M ; ./flusher
1367+1 posts in
1367+1 posts ut
1434386432 bytes (1.4 GB, 1.3 GiB) copied, 0.404442 s, 3.5 GB/s

출력 flusher:

dirty = 727508 kB -- syncing -- rate = 59 MB/s -- eta = 12 s
...
Done syncing :-)
syncing time = 25 s -- rate = 56 MB/s

편집하다:

현재 버전에는 업데이트된 버전이 있습니다 flusher.watch-flushmkusbu. 다음 별칭을 통해 자체 창과 별도로 사용할 수 있습니다.

alias wf='xterm -title "watch-flush" -fa default -fs 13 -fg yellow -bg "#504030" -geometry 70x7 -e bash -c "watch-flush;read -n1" 2> /dev/null'

관련 정보