亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1452 | 回復(fù): 0
打印 上一主題 下一主題

探察管道 pv: 管道查看器 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-12-17 13:24 |只看該作者 |倒序?yàn)g覽

                管道操作符把一個(gè) UNIX® 命令連接到另一個(gè)命令,從而在命令行上創(chuàng)建專門的程序。但是,管道像是黑箱子,用戶看不到從一個(gè)命令傳遞到下一個(gè)命令的數(shù)據(jù)。Pipe Viewer 可以探察管道。本文介紹如何在日常任務(wù)中使用它。
                       
UNIX 中最巧妙最強(qiáng)大的功能之一是 shell。shell 比 GUI 高效得多,還可以通過編寫腳本自動執(zhí)行許多任務(wù)。更好的是,管道操作符可以在命令行上組裝出專門的程序。管道按次序把命令連接起來,前一個(gè)命令的輸出作為后一個(gè)命令的輸入。
       
                       

                                常用縮寫詞
                               
  • GUI:Graphical user interface

                       
                       
但是,管道有一個(gè)大缺點(diǎn):它像是黑箱子。如果把命令連接在一起,那么只有序列中最后一個(gè)命令生成的輸出能夠反映管道的進(jìn)度。當(dāng)然,可以在序列中插入 tee,還可以用 tail 查看輸出文件的增長,但是這些解決方案都不完善,會把多個(gè)階段的標(biāo)準(zhǔn)輸出 (stdout) 和標(biāo)準(zhǔn)錯(cuò)誤 (stderr) 混在一起。另外,這兩個(gè)解決方案比較粗糙,很可能無法表明每個(gè)步驟所需的計(jì)算量。
       
                       
當(dāng)
然,可以把復(fù)雜的序列分解為多個(gè)單獨(dú)的步驟,每個(gè)步驟有自己的中間輸出文件。的確,如果希望檢查每個(gè)步驟的結(jié)果,分解是最理想的方法。編寫一個(gè)腳本,為每
個(gè)步驟生成一個(gè)數(shù)據(jù)文件,在每對步驟之間使用數(shù)據(jù)文件作為輸入,以最后的文件作為最終結(jié)果。但是,這種做法浪費(fèi)了命令行的靈活性。
                       
我們需要的是一個(gè)可以嵌入命令行中的進(jìn)度度量工具。理想情況下,可以對每個(gè)步驟重復(fù)使用這個(gè)工具,它應(yīng)該是開放源碼的,可以移植到 Linux® 和 Mac OS X 等多種 UNIX 變體上。
       
                       
好了,不必再盼望了:Pipe Viewer (pv) 就是這樣的工具。它由系統(tǒng)管理員 Andrew Wood 編寫,經(jīng)過其他許多開發(fā)人員改進(jìn),前后歷時(shí)四年。它提供了探察命令行管道的能力。它的
項(xiàng)目頁面
上說,pv “可以插入管道中兩個(gè)進(jìn)程之間,從而顯示傳遞數(shù)據(jù)的速度、已經(jīng)花費(fèi)的時(shí)間以及剩余時(shí)間。” 更引人注目的是,可以在同一個(gè)命令行中插入多個(gè) pv 實(shí)例以顯示相對吞吐量。
       
                       
本文介紹如何在 UNIX 系統(tǒng)上構(gòu)建 pv,以及如何在簡單和復(fù)雜的命令行組合中應(yīng)用它。但是,我們首先回顧一下管道連接進(jìn)程的方式。
       
                       
UNIX 管道:進(jìn)程的連接
                       
圖 1
說明通過創(chuàng)建管道連接兩個(gè)獨(dú)立進(jìn)程的步驟。
               
                       
                               
圖 1. 通過創(chuàng)建管道連接兩個(gè)進(jìn)程
                               

                               

                       
                       
首先,在第一階段,初始進(jìn)程從標(biāo)準(zhǔn)輸入 stdin 讀取數(shù)據(jù),把輸出寫到 stdout,把錯(cuò)誤發(fā)送到 stderr。stdin、stdout 和 stderr 都是文件描述符,即文件的句柄。文件句柄上的每個(gè)操作(例如 open、read、write、rewind、truncate 和 close)影響文件的狀態(tài)。
               
                       
接下來,在第二階段,初始進(jìn)程創(chuàng)建一個(gè)管道。管道由一個(gè)隊(duì)列和兩個(gè)文件描述符(一個(gè)用于數(shù)據(jù)入列,另一個(gè)用于數(shù)據(jù)出列)組成。管道是先入先出 (FIFO) 數(shù)據(jù)結(jié)構(gòu)。
               
                       
管道本身沒什么用;它的作用是連接數(shù)據(jù)生成者和數(shù)據(jù)消費(fèi)者。因此,初始進(jìn)程在第三階段生成(創(chuàng)建)第二個(gè)進(jìn)程,它作為數(shù)據(jù)消費(fèi)者。
               
                       
在第四階段(假設(shè)新的進(jìn)程是消費(fèi)者),原來的進(jìn)程把它的 stdout 替換為管道的生成者端,讓剛生成的進(jìn)程連接管道的消費(fèi)者端,以它作為自己的 stdin。經(jīng)過這些調(diào)整之后,原來的進(jìn)程(現(xiàn)在的生成者)執(zhí)行的每個(gè) write 操作都進(jìn)入隊(duì)列,然后由新進(jìn)程(現(xiàn)在的消費(fèi)者)讀取。
               
                       
在使用命令行管道操作符 (|) 連接兩個(gè)實(shí)用程序時(shí),shell 就是采用第一到第四階段這樣的過程,但是 shell 為每個(gè)實(shí)用程序生成新進(jìn)程,其本身并不執(zhí)行作業(yè)控制。
               
                       
例如,
圖 2
說明如何通過管道連接 find、grep 和 wc 命令,從而尋找名稱以小寫字母 a 開頭的所有文件并統(tǒng)計(jì)其數(shù)量。shell 仍然是獨(dú)立的;find 是生成者,grep 作為 find 的消費(fèi)者和 wc 的生成者。wc 也同時(shí)作為消費(fèi)者和生成者:它消費(fèi)來自 grep 的數(shù)據(jù)并向 stdout 生成輸出。通常,shell 把 stdout 連接到一個(gè)終端,但是也可以把輸出重定向到文件。
               
                       
                               
圖 2. 使用管道連接命令
                               

                       
                       
如果希望探察兩個(gè) UNIX 進(jìn)程,那么要?jiǎng)?chuàng)建兩個(gè)管道,重新連接每個(gè)進(jìn)程的文件描述符,讓它們同時(shí)作為生成者和消費(fèi)者。
圖 3
說明覆蓋這兩個(gè)進(jìn)程的 stdin 和 stdout 的進(jìn)程間交換。
               
                       
                               
圖 3. 查看兩個(gè) UNIX 進(jìn)程
                               

                       
                       
簡單回顧管道之后,我們來看看 Pipe Viewer。
                       



Pipe Viewer:可觀察的管道
                       
Pipe Viewer 是一個(gè)開放源碼應(yīng)用程序?梢韵螺d它的源代碼并從頭構(gòu)建這個(gè)應(yīng)用程序,也可以從您的 UNIX 發(fā)行版的存儲庫獲得二進(jìn)制代碼(如果有的話)。
               
                       
要想從頭構(gòu)建,首先從 Pipe Viewer 項(xiàng)目頁面(見
參考資料
)下載最新的源代碼壓縮文件。到 2009 年 9 月中旬,最新版本是 1.1.4。解壓壓縮文件,進(jìn)入剛創(chuàng)建的目錄,輸入 ./configure,然后輸入 make 和 sudo make install。在默認(rèn)情況下,構(gòu)建過程會在 /usr/local/bin 中安裝一個(gè)名為 pv 的可執(zhí)行文件。(輸入 ./configure --help 可以看到配置選項(xiàng)的列表)。
清單 1
給出安裝命令。
               
                       
清單 1. Pipe Viewer 安裝命令
                               
$ wget http://pipeviewer.googlecode.com/files/pv-1.1.4.tar.bz2
$ tar xjf pv-1.1.4.tar.bz2
$ cd pv-1.1.4
$ ./configure
$ make
$ sudo make install
$ which pv
/usr/local/bin/pv
                       
要想從存儲庫獲得 pv,應(yīng)該使用發(fā)行版的包管理程序搜索 pv 或 pipe viewer。例如,使用 Ubuntu version 9 的 APT 包管理程序執(zhí)行搜索會產(chǎn)生以下輸出:
               
                        $ apt-cache search part viewer
pv - Shell pipeline element to meter data passing through
                       
接下來,使用包管理程序下載并安裝包。對于 Ubuntu,命令是 apt-get install:
               
                        $ sudo apt-get install pv
                       
安裝完成之后,試一下 pv。最簡單的使用方法是用 pv 替代傳統(tǒng)的 cat 實(shí)用程序,把數(shù)據(jù)提供給另一個(gè)程序并測量總吞吐量。例如,可以使用 pv 監(jiān)視一個(gè)長時(shí)間的壓縮操作:
               
                        $ ls -lh listings.txt
-r--r--r--  1 supergiantrobot  staff   109M Sep  1 20:47 listings.txt
$ pv listings.txt | gzip > listings.gz
96.1MB 0:00:09 [11.3MB/s] [=====================>     ] 87% ETA 0:00:01
                       
啟動這個(gè)命令時(shí),pv 顯示一個(gè)進(jìn)度條并不斷更新。典型的 pv 輸出從左到右依次顯示目前已經(jīng)處理的數(shù)據(jù)量、經(jīng)過的時(shí)間、吞吐量(以 MB/s 為單位)、工作進(jìn)度的圖形表示和數(shù)字表示以及估計(jì)的剩余時(shí)間。上面的顯示表明,在工作 9 秒之后,已經(jīng)處理了 109MB 中的 96.1MB,剩余數(shù)據(jù)大約為文件的 13%。
               
                       
在默認(rèn)情況下,pv 會顯示它能夠計(jì)算出值的所有狀態(tài)指標(biāo)。例如,如果 pv 的輸入不是文件,也沒有手工指定大小,進(jìn)度條會從左到右移動以表示有活動,但是由于沒有總大小,它無法計(jì)算出已經(jīng)完成的百分比。例如:
               
                        $ ssh faraway tar cf - projectx | pv --wait > projectx.tar
Password:
4.34MB 0:00:07 [ 611kB/s] [                        ]
                       
這個(gè)示例在遠(yuǎn)程機(jī)器上運(yùn)行 tar,把遠(yuǎn)程命令的輸出發(fā)送給本地系統(tǒng)以創(chuàng)建 projectx.tar。因?yàn)?pv 無法計(jì)算出要傳輸?shù)目傋止?jié)數(shù),它只能顯示到目前為止的吞吐量、經(jīng)過的時(shí)間和一個(gè)反映活動的特殊標(biāo)志。只要有數(shù)據(jù)流過,就顯示從左到右移動的小 “車” ()。
               
                       
--wait 選項(xiàng)把進(jìn)度的顯示延遲到實(shí)際收到第一個(gè)字節(jié)時(shí)。在這里,--wait 是有意義的,因?yàn)?ssh 命令可能提示輸入密碼。
               
                       
可以根據(jù)需要用各種標(biāo)志啟用不同的指標(biāo):
                        $ ssh faraway tar cf - projectx | \
  pv --wait --bytes > projectx.tar
  Password:
   268kB
                       
這個(gè)命令用 --bytes 顯示正在處理的字節(jié)數(shù)。其他選項(xiàng)是 --progress、--timer、--eta、--rate 和 --numeric。如果指定一個(gè)或多個(gè)顯示選項(xiàng),就會自動地禁用其他所有(未指定的)指標(biāo)。
               
                       
pv 有另一種簡單的使用方法。--rate-limit 選項(xiàng)可以限制吞吐量。這個(gè)選項(xiàng)的參數(shù)是一個(gè)數(shù)字和一個(gè)后綴,比如 m 表示 MB/s:
               
                        $ ssh faraway tar cf - projectx | \
  pv --wait --quiet --rate-limit 1m > projectx.tar
                       
這個(gè)命令隱藏所有指標(biāo) (--quiet) 并把吞吐量限制為 1MB/s。
               
                       



Pipe Viewer 的高級用法
                       
到目前為止,示例都是使用 Pipe Viewer 的單一實(shí)例作為一對命令中的生成者或消費(fèi)者。但是,也可以使用更復(fù)雜的組合?梢栽谕粋(gè)命令行上多次使用 pv,但是有一些限制。具體地說,必須使用 --name
                                命名 每個(gè) pv 實(shí)例,還必須使用 --cursor 啟用多行模式。這兩個(gè)選項(xiàng)的組合創(chuàng)建一系列帶標(biāo)簽的輸出行,每個(gè)命名的實(shí)例一行。
               
                       
例如,假設(shè)希望同時(shí)單獨(dú)地監(jiān)視數(shù)據(jù)傳輸和壓縮的進(jìn)度。可以給前一個(gè)操作分配一個(gè) pv 實(shí)例,給后一個(gè)操作分配另一個(gè)實(shí)例,比如:
               
                        $ ssh faraway tar cf - projectx | pv --wait --name ssh | \
  gzip | pv --wait --name gzip > projectx.tgz
                       
輸入密碼之后,Pipe Viewer 命令生成兩行進(jìn)度顯示:
                          ssh: 4.17MB 0:00:07 [ 648kB/s] [                  ]
       gzip:  592kB 0:00:06 [62.1kB/s] [                  ]
                       
第一行的標(biāo)簽是 ssh,顯示傳輸?shù)倪M(jìn)度;第二行的標(biāo)簽是 gzip,顯示壓縮的進(jìn)度。因?yàn)檫@兩個(gè)命令都不能確定要操作的字節(jié)數(shù),所以每行上只顯示累計(jì)的總數(shù)據(jù)量和活動條。
               
                       
如果知道或者能夠估計(jì)要操作的字節(jié)數(shù),那么可以使用 --size 選項(xiàng)。添加這個(gè)選項(xiàng)會在進(jìn)度條中提供更細(xì)粒度的信息。
               
                       
例如,如果希望監(jiān)視一個(gè)大型存檔任務(wù)的進(jìn)度,可以使用其他 UNIX 實(shí)用程序計(jì)算原文件的總大小。df 實(shí)用程序可以顯示整個(gè)文件系統(tǒng)的統(tǒng)計(jì)數(shù)據(jù),du 可以計(jì)算任意深度的層次結(jié)構(gòu)的大。
               
                        $ tar cf - work | pv --size `du -sh work | cut -f1` > work.tar
                       
在這里,子 shell 命令 du -sh work | cut -f1 以與 pv 兼容的格式生成工作目錄的總大小。du -h 產(chǎn)生人習(xí)慣的表示格式,比如 17M 表示 17 MB,這種格式適合在 pv 中使用。(ls 和 df 命令也支持通過 -h 產(chǎn)生人可讀的格式)。因?yàn)?pv 現(xiàn)在知道將通過管道傳輸?shù)淖止?jié)數(shù),所以它可以顯示真正的進(jìn)度條:
               
                        700kB 0:00:07 [ 100kB/s] [>                    ]  4% ETA 0:02:47
                       
最后,還有一種很有用的技術(shù)。除了統(tǒng)計(jì)字節(jié)數(shù)之外,Pipe Viewer 還可以通過計(jì)算行數(shù) 顯示進(jìn)度。如果指定 --line-mode,pv 會在每次遇到換行符時(shí)更新進(jìn)度條。還可以提供 --size 和預(yù)期的行數(shù)。
               
                       
例如,用戶經(jīng)常使用 find 在大范圍內(nèi)尋找很小的東西,比如在大量應(yīng)用程序代碼中尋找使用某個(gè)系統(tǒng)調(diào)用的所有地方。在這種情況下,可能執(zhí)行下面這樣的命令:
               
                        $ find . -type f -name '*.c' -exec grep --files-with-match fopen \{\} \; > results
                       
這個(gè)命令會找到包含字符串 fopen 的所有 C 源代碼文件并輸出文件名。輸出收集在名為 results 的文件中。為了反映活動,在這個(gè)命令中添加 pv:
               
                        $ find . -type f -name '*.c' -exec grep --files-with-match fopen \{\} \; | \
  pv --line-mode > results
                       
行模式很有意義,因?yàn)?find 等許多 UNIX 命令操作文件的元數(shù)據(jù),而不是文件的內(nèi)容。行模式很適合那些復(fù)制或壓縮大型文件集的系統(tǒng)管理腳本。
               
                       
一般情況下,只要可以度量速度,就可以在命令行和腳本中插入 Pipe Viewer。但是,可能需要發(fā)揮創(chuàng)造性。例如,要度量復(fù)制一個(gè)目錄的速度,應(yīng)該把 cp -pr 改為 tar:
               
                        $ # an equivalent of cp -pr old/somedir new
$ (cd old; tar cf - somedir) | pv | (cd new; tar xf - )
                       
對于 wget、curl 和 scp 等網(wǎng)絡(luò)實(shí)用程序,也可以考慮使用行模式。例如,可以使用 pv 度量大小可變的上傳操作的進(jìn)度。因?yàn)樵S多網(wǎng)絡(luò)工具可以從文件接收輸入,可以使用文件的長度作為 --size 選項(xiàng)的參數(shù)。
               
                       



結(jié)束語
                       
Pipe Viewer 是不太為人所知的寶貴工具之一,但是一旦掌握了它,您就會發(fā)現(xiàn)離不開它了。您可能在平時(shí)使用命令行時(shí)發(fā)現(xiàn)一些需要應(yīng)用 pv 的地方,但是更常用的地方是自動化腳本。不再需要盯著閃動的光標(biāo)長時(shí)間等待了,現(xiàn)在可以通過插入 Pipe Viewer 提供實(shí)時(shí)的反饋。Pipe Viewer 讓您能夠監(jiān)視原本隱秘的過程。
               
               
               
               
               
               

本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u3/100692/showart_2123728.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP