Categories: Linux

Linux 監看指令管線執行進度 pv 指令教學與範例

介紹如何在 Linux 中使用 pv 搭配其他指令顯示工作執行進度。

pv 指令是一個管線查看器(pipe viewer),可以搭配各種的 Linux 指令(例如 cptargzip 等),監看 Linux 中管線內的資料處理進度相關資訊,包含:

  • 經過時間。
  • 完成百分比。
  • 目前資料處理速度。
  • 已處理的資料量。
  • 剩餘時間。

安裝 pv 工具

若在 Ubuntu Linux 中可使用 apt 來安裝 pv 套件:

# 安裝 pv 套件
sudo apt install pv

pv 使用方式

pv 的基本運作概念是從標準輸入(standard input)讀取資料,然後將資料輸出至標準輸出(standard output),並將資料處理的資訊輸出至標準錯誤(standard error)。

pv 指令運作機制

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 等待有資料開始處理時,再開始計算時間與處理進度。適合搭配 gpgmcrypt 等需要在處理資料之前先輸入密碼的工具。
-D SEC 等待 SEC 秒之後再顯示處理進度訊息,可讓馬上就結束的工作省略顯示進度。SEC 支援小數,例如 0.5
-s SIZE 設定總資料量大小為 SIZE 位元組(bytes),此數值會用於進度顯示與計算預估完成時間。SIZE 也可以搭配 km 等單位,例如 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),可以搭配 KMGT 等單位使用,例如 256K
-B BYTES 設定傳輸緩衝區大小為 BYTES 位元組(bytes),可以搭配 KMGT 等單位使用。
-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

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago