介紹如何在 Linux 中使用 pv
搭配其他指令顯示工作執行進度。
pv
指令是一個管線查看器(pipe viewer),可以搭配各種的 Linux 指令(例如 cp
、tar
、gzip
等),監看 Linux 中管線內的資料處理進度相關資訊,包含:
- 經過時間。
- 完成百分比。
- 目前資料處理速度。
- 已處理的資料量。
- 剩餘時間。
安裝 pv
工具
若在 Ubuntu Linux 中可使用 apt
來安裝 pv
套件:
# 安裝 pv 套件
sudo apt install pv
pv
使用方式
pv
的基本運作概念是從標準輸入(standard input)讀取資料,然後將資料輸出至標準輸出(standard output),並將資料處理的資訊輸出至標準錯誤(standard error)。
pv
指令可以隨意安插在指令管線中的任何位置,例如監看 md5sum
指令計算檢查碼的進度:
# 監看管線資料處理進度
cat myfile | pv | gzip | md5sum
264MiB 0:00:09 [28.4MiB/s] [ <=> ]
也可以讓 pv
直接從檔案讀取輸入的資料,輸出至標準輸出:
# 監看檔案資料讀取進度
pv myfile | gzip | md5sum
179MiB 0:00:06 [29.7MiB/s] [============> ] 41% ETA 0:00:08
當 pv
放在管線中間時,若沒有額外指定總資料量的大小,就無法計算出剩餘時間與進度,而如果是直接從檔案讀取資料時,可以從檔案的大小來判斷總資料量,所以可以計算並顯示進度與剩餘時間。
pv
運作起來的效果就跟 cat
指令相同,只是會多顯示資料處理的進度而已。
指定顯示資訊
pv
在監看資料處理進度時,有許多的資料顯示選項可以調整:
參數 | 說明 |
---|---|
-p |
顯示進度條(progress bar)。 |
-t |
顯示經過時間(timer)。 |
-e |
啟用預計完成時間(ETA)功能,顯示剩餘時間。 |
-I |
啟用預計完成時間功能,顯示預計完成時間點。 |
-r |
顯示目前資料處理速度(rate counter)。 |
-b |
顯示目前資料處理量(total byte counter)。 |
-a |
顯示平均資料處理速度(average rate counter)。 |
-T |
顯示傳輸緩衝出使用率(transfer buffer percentage)。 |
-A NUM |
顯示最後 NUM 個處理過的字元。 |
-F FORMAT |
自訂輸出資訊格式。 |
-n |
以單純數字格式輸出,輸出的資訊適合倒給其他工具程式使用(例如dialog )。 |
-q |
不輸出任何訊息,通常會搭配 -L 限制資料處理速度來使用。 |
pv
在執行時若不加上任何參數,預設會使用 -p
、-t
、-e
、-r
、-b
這些參數組合。
使用者可依照需求自定輸出的資訊:
# 顯示進度條與預計完成時間 pv -pI myfile | gzip | md5sum
[========================> ] 42% ETA 14:39:31
輸出調整參數
以下是一些 pv
指令的輸出調整參數:
參數 | 說明 |
---|---|
-W |
等待有資料開始處理時,再開始計算時間與處理進度。適合搭配 gpg 或 mcrypt 等需要在處理資料之前先輸入密碼的工具。 |
-D SEC |
等待 SEC 秒之後再顯示處理進度訊息,可讓馬上就結束的工作省略顯示進度。SEC 支援小數,例如 0.5 。 |
-s SIZE |
設定總資料量大小為 SIZE 位元組(bytes),此數值會用於進度顯示與計算預估完成時間。SIZE 也可以搭配 k 或 m 等單位,例如 10m 。 |
-l |
以行(line)數為基準進行進度的計算。當使用此參數時,-s 所指定的數值就會被視為總行數,而檔案的大小也不會被自動計算。 |
-0 |
以 NULL 字元作為行尾的判斷字元。當使用此參數時,也會自動啟用 -l 參數。 |
-i SEC |
每間隔 SEC 秒更新一次資訊。 |
-w WIDTH |
設定終端機寬度為 WIDTH 字元,用於輸出排版。 |
-w HEIGHT |
設定終端機高度為 HEIGHT 字元,用於輸出排版。 |
-N NAME |
輸出訊息時,加上 NAME 這個前綴字串,適合用於區分多個 pv 的輸出資訊。 |
-f |
強制輸出訊息,用於標準錯誤不是終端機的狀況。 |
-c |
使用游標位置跳脫序列定位,用於多個 pv 的輸出,通常可以搭配 -N 參數使用。 |
資料處理調整參數
以下是一些 pv
指令的輸出調整參數:
參數 | 說明 |
---|---|
-L RATE |
設定資料處理速度上限值為 RATE 位元組(bytes),可以搭配 K 、M 、G 、T 等單位使用,例如 256K 。 |
-B BYTES |
設定傳輸緩衝區大小為 BYTES 位元組(bytes),可以搭配 K 、M 、G 、T 等單位使用。 |
-C |
不使用高效率的 splice,改用傳輸緩衝區。可以確保 -A 與 -T 功能正常運作。 |
-E |
忽略讀取錯誤。 |
-S |
處理到 -s 指定的資料量之後就結束執行。 |
-d PID[:FD] |
對於行程 ID 為 PID 的行程,監看其檔案描述符(file descriptor)為 FD 的檔案的資料處理進度。若沒有指定 FD ,則所有開啟的檔案都會被監看。 |
-R PID |
取代原有的 pv 。假設有一個 pv -L 123K 正在執行,其行程 ID 為 9876 ,此時若執行 pv -R 9876 -L 321K ,就可讓資料處理速度提升至 321K 。 |
實際應用範例
以下是各種 pv
指令的實際應用範例。
tar
壓縮、解壓縮檔案
使用 pv
配合 tar
指令,顯示壓縮檔案進度:
# 顯示 tar 壓縮檔案進度 tar zcf - myfolder | pv > myfolder.tar.gz
使用 pv
配合 tar
指令,顯示解壓縮檔案進度:
# 顯示 tar 解壓縮檔案進度
pv myfolder.tar.gz | tar zxf -
gzip
壓縮、解壓縮檔案
使用 pv
配合 gzip
指令,顯示壓縮檔案進度:
# 顯示 gzip 壓縮檔案進度 gzip -c myfile | pv > myfile.gz
使用 pv
配合 gzip
指令,顯示解壓縮檔案進度:
# 顯示 gzip 解壓縮檔案進度 pv myfile.gz | gzip -d > myfile
傳輸檔案
使用 pv
配合 nc
指令,顯示檔案傳輸進度:
# 顯示檔案傳輸進度 pv myfile | nc -w 1 somewhere.com 3000
備份磁碟
使用 pv
備份磁碟,並顯示備份進度:
# 顯示磁碟備份進度(忽略錯誤) pv -EE /dev/sda > disk-image.img
使用 pv
從備份檔案恢復磁碟,並顯示恢復進度:
# 顯示恢復磁碟資料進度 pv disk-image.img > /dev/sda
抹除磁碟
使用 pv
抹除磁碟內容(填入 0
),並顯示抹除進度:
# 顯示抹除磁碟進度 pv < /dev/zero > /dev/sda