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"

経過時間の割合と到着予定時刻が表示されます。

関連情報