PV 명령은 대화 상자에 진행률을 표시하는 데 사용됩니다(전송 속도(Mbits))

PV 명령은 대화 상자에 진행률을 표시하는 데 사용됩니다(전송 속도(Mbits))

PV -n 명령을 사용하여 파티션을 읽고 gzip과 파이프를 사용하여 읽은 데이터를 압축하고 파일을 저장합니다. 데이터를 읽고 쓰는 동안 Linux 대화 상자 유틸리티를 사용하여 진행 상황을 표시하기 위해 while 루프를 사용하고 있습니다.

이것은 훌륭하게 작동하며 진행 상황이 업데이트되었습니다. 또한 전송 속도/읽기 속도를 메가비트 단위로 표시하고 싶습니다. 또한 진행 상황과 전송 속도(메가비트)로 데이터베이스 테이블을 업데이트하고 싶습니다.

각 줄을 읽기 위해 while 루프를 사용하고 있으므로 각 업데이트의 진행 상황이 새 줄에 표시되어야 합니다. 아래 내 코드를 참조하세요.

        (pv -n /dev/$partitions | gzip -c >$path/${filename// /_}-${partitions}.img.gz) 2>&1 | while IFS= read -r progress;
                                do
                                        echo "processing /dev/$partitions currently completed $progress" >/run/log.log
                                        echo $progress | dialog --title "Capturing OS image of $hdd" --gauge " now creating image of HDD $hdd writing $filename Image, please wait...\n\n\n
                                        Processing Partition $i of $totalparts\n\n
                                        This process may take some time to complete\n\n" 13 90 0

mysql -u root -pxxxxxx dbi -h localhost | insert into speed(progress, speed) Values ("$line", "mbits")
                                    done

pv -n 명령을 사용하면 줄 바꿈에 대한 진행률의 숫자 값만 반환됩니다. 아래 예를 참조하세요.

( /data/pv -n /dev/nvme0n1p1 | gzip -c >/run/test.img ) 
5
9
29
67
100

위의 진행률 표시줄은 매우 유용하지만 평균 속도(메가비트)로 데이터베이스를 업데이트하고 싶습니다.

진행 상황을 확인하기 위해 평균 속도 증분으로 pv 명령을 실행하면 새 줄을 인쇄하는 대신 동일한 줄에서 진행 상황이 업데이트되어 스크립트가 중단됩니다. 아래 예를 참조하세요.

(pv -rep /dev/nvme0n1p1 | gzip -c >/run/test.img ) 
[4.9MiB/s] [====>                             ]  4% ETA 0:00:19

이상적인 출력은 다음과 같습니다.

(pv -rep /dev/nvme0n1p1 | gzip -c >/run/test.img ) 
[ 4.18MiB/s] [====>                          ]  14% ETA 0:00:19
[14.49MiB/s] [===========>                   ]  54% ETA 0:00:19
[24.39MiB/s] [========================>      ]  74% ETA 0:00:19
[44.29MiB/s] [===========================>   ]  78% ETA 0:00:19
[46.19MiB/s] [=============================> ]  98% ETA 0:00:19
[57.99MiB/s] [==============================>]  100% ETA 0:00:19

AWK, Sed 및 Grep을 사용하여 필요한 데이터의 형식을 지정하고 while 루프에서 사용할 수 있습니다. 하지만 어떻게 작동하게 만들 수 있나요?

pv -F $'%t %r %e\n' 을 사용하면 원하는 결과를 얻습니다. 하지만 AWK, grep 또는 tr 명령은 사용할 수 없습니다. 아무것도 반환하지 않는 아래 예를 참조하세요.

(pv -F $'%t %r %e\n' /dev/nvme0n1p1 | gzip -c >/run/test.img ) 2>&1 | tr -d ':[]'

또한 위의 동일한 명령을 사용하여 stderr를 stdout으로 리디렉션하지 않으면 예상된 결과를 얻을 수 없습니다. 아래를 참조하세요. tr -d를 사용하여 다음 문자 ":[]"를 제거하면 작동하지 않습니다.

 (pv -F $'%t %r %e\n' /dev/nvme0n1p1 | gzip -c >/run/test.img ) | tr -d ':[]'
0:00:01 [25.2MiB/s] ETA 0:00:18
0:00:02 [23.7MiB/s] ETA 0:00:18
0:00:03 [ 100MiB/s] ETA 0:00:07
0:00:04 [ 199MiB/s] ETA 0:00:01

pv -n -r -e와 같은 다른 매개변수를 사용하면 다른 모든 매개변수는 무시되고 줄바꿈에 숫자 진행 값만 반환됩니다.

위에서 설명한 기능을 달성하기 위해 사용할 수 있는 pv의 대안이 있을 수도 있고, pv 명령을 사용하는 데 누군가 도움을 줄 수도 있습니다.

답변1

-F를 사용하여 출력 형식을 지정합니다.

예를 들어:

pv -F "%T %t %r %e"

경과 시간의 백분율과 예상 도착 시간이 제공됩니다.

관련 정보