iT邦幫忙

DAY 23
4

回應鐵人賽的文章變鐵人系列 第 23

[Reply] 你應知道的 Unix 工具:Pipe Viewer

genehong 在 我的30份工作經驗 -- 以 Open Source 的 SI 裡,
提及用開源碼軟體的公司,
不是用Linux就是用FreeBSD,
而這個工具在各平台都適用。
Pipe viewer 或簡稱 pv,是透過pipeline來看資料處理進度的終端具工具,
pv 可以插在任何兩處理程序間的pipeline,
有視覺化的指標來看資料傳遞得多快,
離完成有多遠,
估計還需多少時間完成。

pv是很有Unix系統管理經驗的 Andrew Wood 所寫的,
而此軟體的官網在

如何用pv?
假設你有個幾GB的 access.log 的網頁記錄檔,
想要用 gunzip 來壓成 .gz 的檔:

$ gzip -c access.log > access.log.gz

由於檔案有幾GB那麼大,
你不知道要等多久,
到底是很快就完成?
還是會再花個30分鐘?

用pv可以精確知道會花多少時間:

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

pv 在這邊看起來像 cat 作用一樣,
卻只是多了進度表的顯示。
這裡可看到gzip處理611MB的資料11秒,
已進行所有資料的15%,
將再花約59秒的時間完成所有工作。

你也可以用多個pv在各程序間,
例如可以算資料多快地從磁碟讀取,
以及多少的資料被gzip壓縮輸出:

$ pv -cN source access.log | gzip | pv -cN gzip > access.log.gz
source:  760MB 0:00:15 [37.4MB/s] [=>     ] 19% ETA 0:01:02
  gzip: 34.5MB 0:00:15 [1.74MB/s] [  <=>  ]

這裡的 -N 是要pv產生一個名稱來識別。
-c 是確認輸出不會被另個pv當成無用資料而覆蓋過去。

這例子是說 access.log 檔案以每秒 37.4MB 的速度被讀取,
但gzip只以每秒1.74MB的速度處理,
馬上就可算出壓縮速率,
37.4/1.74 = 21x

gzip不包括資料還剩多少,
或需多快完成的資訊,
是因為pv程序是在gzip之後,
所以不曉得gzip還會丟出多少資料來。
而第一個pv程序知道還剩多少資料,
是因為正讀著該檔。

另個類似例子是壓縮整個目錄成一壓縮檔:

$ tar -czf - . | pv > out.tgz
 117MB 0:00:55 [2.7MB/s] [>         ]

這是pv呈現tar -czf的輸出速率。
因沒提供剩多少資料的相關資訊,這就不夠有趣。

所以需要提供正在壓縮整體資料量的資訊給pv,
而可以這樣子做:

$ tar -cf - . | pv -s $(du -sb . | awk '{print $1}') | gzip > out.tgz
 253MB 0:00:05 [46.7MB/s] [>     ]  1% ETA 0:04:49

這是用 tar 以-c參數來把目前的目錄裡所有檔案來產生tar,
把資料送出到標準輸出-f-。
用 -s 的參數,來指定說目前整個目錄的大小為何給 pv,
而這大小是用 du -sb . | awk '{print $1}' 算出的數字,
然後用gzip壓整個內容輸出成 tgz 檔。
這個方法pv知道剩多少資料要處理,
而秀出還要4分49秒完成。

另個例子是藉由nc在網路間傳遞大檔案。
若有兩台電腦A,B,
想很快地把A的目錄傳到B去,
最快的方法是用tar及nc,
再加上用pv來算處理時間。

# 電腦 A的IP是 192.168.1.100
$ tar -cf - /path/to/dir | pv | nc -l -p 6666 -q 5
# 在電腦 B
$ nc 192.168.1.100 6666 | pv | tar -xf -

電腦A的目錄/path/to/dir裡的所有檔案,
將傳給電腦B,
你希望看傳得多快。

若你想要看進度表,
可用之前例子中的 pv -s $(...) 技巧 (只在電腦A)。

另個有趣例子是,
電腦從 /dev/zero 會讀取得多快:

$ pv /dev/zero > /dev/null
 157GB 0:00:38 [4,17GB/s]

如何安裝pv?

#在Debian或Ubuntu
$ sudo aptitude install pv
#在Fedora或CentOS:
$ sudo yum install pv
#在Slackware
$ tar -zxf pv-version.tar.gz
$ cd pv-version
$ ./configure && sudo make install
#在Mac
$ sudo port install pv
#在OpenSolaris
$ pfexec pkg install pv
#在Windows裡用Cygwin
$ ./configure
$ export DESTDIR=/cygdrive/c/cygwin
$ make
$ make install

詳細使用手冊參考 man pv

本文簡譯自 A Unix Utility You Should Know About: Pipe Viewer

系列文章


上一篇
[Reply] 在Linux環境下,每行的開頭或結尾的字串處理,很簡潔
下一篇
[Reply] 你該知道的Unix的工具:lsof (一)
系列文
回應鐵人賽的文章變鐵人30

尚未有邦友留言

立即登入留言