当前位置: 首页 > 工具软件 > Pipe Viewer > 使用案例 >

您应该知道的UNIX工具系列之1:Pipe Viewer

茹康裕
2023-12-01

这是Peteris Krumins博客里看到的文章,大家可以到http://www.catonmat.net/blog/unix-utilities-pipe-viewer/阅读原文。

 

大家好,我将从这里开始写另一个文章系列。这个系列的主题是您应该知道的UNIX工具。每次将讨论一个UNIX程序。我将尽力写好每个工具的介绍,并尽可能多地给出一些我能想到的例子。

在开始之前,我想澄清一件事为什么我会写这么多系列文章?答案是:我同时写了很多主题文章,在它们之间来回切换时,我感觉到莫大的成就和鼓舞。

本系列的第一篇文章,我们讨论一个不那么广为人知的UNIX程序,它叫做Pipe Viewer,简称pv。它是一个基于终端的工具,用于监视通过管道的数据处理过程。它可以插入到任何两个进程间的正常管道中,并给出一些直观的可视提示信息:包括数据通过管道的速率、已经消耗了多少时间、剩余多少、估数据处理完毕还需要多少时间。

Pipe viewer的作者是一位经验丰富的UNIX系统管理员-- Andrew WoodPV的主页是pv utility

如果您对这东西感兴趣,那么请订阅我的 rss feed,以便自动接收后续的消息。

怎样使用PV

好吧,让我们从一些简单的例子开始,由浅及深地了解它吧。

假设您有一个名为””access.log”的文件,它包含几G大小的WEB日志。您想要把它压缩为较小的文件,比方说用gunzip存档。显然,您会用下面的方法:

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

因为文件很大(几个G),您不知道该等多久。它会很快完成呢?还是会等上30分钟?

通过pv,您可以知道这个过程所需要的精确时间。看一下用pv完成同样操作的情况:

$ pv access.log | gzip > access.log.gz

611MB 0:00:11 [58.3MB/s] [=>     ] 15% ETA 0:00:59

在这里,Pipe viewer充当“猫”的角色之外,它还增加了一个进度条。我们可以看到gzip11秒内处理了611M数据。它已经处理了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进程写入到另一个pv进程时,不会被废弃。

这个例子的输出内容显示了:”access.log”文件的读取速度是37.4MB/s,但gzip写数据的速度只有1.74MB/秒。我们马上就可以计算出压缩率:37.4/1.74 = 21x

注意:本例gzip的处理信息中,没有剩余多少数据和时间的信息。这是因为gzip后面的py进程没办法知道gzip会产生多少数据(它仅是把输入流的压缩数据给出而已)。但是,第一个py进程,知道数据的剩余量,因为它是读取方。

另一个类似的例子是:把整个目录里的文件压缩为一个tar包:

$ tar -czf - . | pv > out.tgz

 117MB 0:00:55 [2.7MB/s] [>        ]

在这个例子中,pv仅显示了”tar –czf”命令的输出速率。是不是有点无趣?它没有提供任何剩余数据的信息,而我们需要它提供一些数据量的信息。我们可以这样做:

$ tar -cf - . | pv -s $(du -sb . | awk '{print $1}') | gzip > out.tgz

 253MB 0:00:05 [46.7MB/s] [>    ] 1% ETA 0:04:49

这里发生的事情是这样的:我们通过”-c”选项,告诉tar工具(递归)创建一个当前目录”.”的归档文件,并输出到标准输出(“-f –“选项)。接下来,通过-s选项,向pv指定数据容量, du -sb . | awk '{print $1}'以字节为单位返回当前目录下所有文件的大小,并作为pv –s选项的参数。接下来,用gzip压缩所有内容,并将结果输出到目标文件out.tgz。这样,”pv”就能够知道剩余的数据量并显示出来,嗯,如上表所示,还需要449秒时间才能压缩完毕。

 

另一个很好的例子是通过网络拷贝大量的数据。(例子中用到”nc”工具)关于”nc”工具的使用帮助,我会另抽时间来写。

假设您有两台计算机AB。您想快速地把某个目录从A转移到B,那最快的方式是使用nc,并用pv来对操作计时。

#在计算机A上操作, AIP 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计算机上执行就可以)。

 

另一个有趣的例子的我的博客读者alexandru提供的。他的例子可以测试机器从/dev/zero读取数据的速度:

$pv /dev/zero > /dev/null

 157GB 0:00:38 [4,17GB/s]

就这些了。我希望您会喜欢我的例子,并能学到点新东西。我喜欢解释和分享东西。:)

怎样安装pv?

如果您是DebianUbuntu用户,按下面方式安装:

$ sudo aptitude install pv

如果您是FedoraCentOS用,按下面方式安装:

$ sudo yum install pv

如果您是Slackware用户,那么到 pv homepage下载源码,并执行安装三步曲:

$ 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有。

有兴趣用pv测量下您的管道吧。下回再见。

给读者的一个问题:您还用过(或知道)哪些不广为人知的UNIX工具呢?

 类似资料: