窥探flutter_窥探管道

Shell是UNIX中最聪明,最强大的创新之一。 它比GUI更有效,并且您可以编写脚本来自动执行许多任务。 更好的是,管道操作员直接在命令行中汇编了临时程序。 管道按顺序依次链接命令,先前命令的输出将成为后续命令的输入。

但是管道有一个主要的缺点:它有点像黑匣子。 如果将命令串在一起,则唯一取得进展的证据是该系列中的最后一条命令生成的输出。 是的,您可以在序列中插入tee ,并且可以观察到输出文件随着tail增长而增长,但是这些解决方案一次运行最好,以免多相的标准输出( stdout )和标准误差( stderr )混合在一起。 此外,这两种解决方案都是粗略的指标,可能掩盖了每个步骤需要多少计算量。

当然,您可以将一个复杂的序列分解为多个单独的步骤,每个步骤都有其自己的临时输出文件。 确实,如果要在每个时间间隔验证结果,则分解是理想的选择。 编写脚本,为每个步骤生成一个数据文件,将每对步骤之间的数据文件用作输入,并收集最终文件作为最终结果。 但是,这种做法不太适合命令行的即兴性质。

需要的是一个进度表,您可以将其嵌入命令行以测量吞吐量。 理想情况下,可以重复使用该仪表来对每个步骤进行基准测试,并且由于天长地短,该工具将是开源的,并且可移植到多种UNIX变体中,例如Linux®和Mac OSX。

好了,不再希望了:由系统管理员Andrew Wood编写并在过去四年中被许多其他开发人员增强的Pipe Viewer( pv )提供了对命令行“管道”的了解。 如其项目页面上所述 ,“可以将pv插入两个进程之间的[a]管道中,以直观地指示数据通过的速度,到目前为止已经经过了多少时间以及完成的程度如何。 ” 值得注意的是,您还可以在同一命令行中插入多个pv实例以显示相对吞吐量。

本文向您展示了如何在UNIX系统上构建pv并将其应用于简单和复杂的命令行组合。 不过,让我们先回顾一下管道如何连接流程。

UNIX管道:进程的管道

图1显示了创建连接两个独立进程的管道的步骤。

图1.创建连接两个流程的管道
用于创建管道的步骤

首先,阶段1,祖先进程从标准输入stdin读取,将输出写入stdout ,并向stderr发出错误。 stdinstdoutstderr每个都是文件描述符或文件的句柄。 文件句柄上的每个操作(例如, openreadwriterewindtruncateclose影响文件的状态。

接下来,在阶段2中,祖先创建管道。 管道由队列和两个文件描述符组成,一个描述符用于排队数据,另一个描述符用于排队数据。 管道是先进先出(FIFO)数据结构。

就其本身而言,管道几乎没有用处。 其目的是将生产者与消费者联系起来。 因此,祖先在第3阶段分叉或创建第二个过程以充当对应对象。

在第4阶段(假设新过程是使用者),原始过程将其stdout替换为管道的生产者端,并重新布线新分支的过程,以处理管道的消费者端及其stdin 。 经过这些调整后,由原始进程(现在是生产者)进行的每次write都会排队,然后由新进程(现在是消费者)进行读取。

第1阶段到第4阶段反映了外壳程序通过命令行管道运算符( | )将一个实用程序连接到另一个实用程序的过程,尽管外壳程序为每个实用程序生成了一个新进程,并且保持不变以执行作业控制。

例如, 图2显示了如何通过管道连接findgrepwc命令,以查找和计算名称以小写a开头的所有文件。 外壳保持独立; find是生产者, grep充当消费者(对于find )和生产者(对于wc )。 wc充当消费者和生产者:它从grep消费,并将输出生成到stdout 。 通常,shell将stdout连接到终端,但是重定向可以将输出重定向到文件。

图2.使用管道连接命令
连接和计数名称以x开头的文件

如果要对等到两个UNIX进程,请创建两个管道并重新连接每个进程的文件描述符,以同时充当生产者和使用者。 图3显示了一个进程间交换,该交换覆盖了两个进程的stdinstdout

图3.研究两个UNIX进程
查看两个UNIX进程的进程间交换

进行了简短的回顾,让我们看一下Pipe Viewer。

管道查看器:明显的导管

Pipe Viewer是一个开源应用程序。 您可以下载其源代码并从头开始构建应用程序,或者,如果有的话,可以从UNIX发行版的存储库中提取现有的二进制文件。

要从头开始构建,请从Pipe Viewer项目页面下载最新的源tarball(请参阅参考资料 )。 截至2009年9月中旬,该代码的最新版本为1.1.4。 解压缩tarball,转到新创建的目录,然后键入./configure ,然后键入makesudo make install 。 默认情况下,构建过程将名为pv的可执行文件安装到/ usr / local / bin中。 (有关配置选项的列表,请键入./configure --help 。) 清单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二进制文件,请使用发行版的程序包管理器并搜索pv或管道查看器。 例如,使用Ubuntu版本9的APT软件包管理器进行的搜索会产生以下匹配:

$ 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代替传统的cat实用程序,以将字节馈送到另一个程序并测量总体吞吐量。 例如,可以使用pv监视冗长的压缩操作:

$ 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

命令启动时, pv发布进度条,并不断更新量规以显示进度。 从左至右,典型的pv显示屏显示到目前为止已处理了多少数据,经过的时间,以兆字节/秒为单位的吞吐量,工作的直观和数字表示以及剩余时间的估计。 在上面的显示中,已处理109MB的96.1MB,在9秒的工作后剩余约13%的文件可以使用。

默认情况下, pv渲染所有能够为其计算值的状态指示器。 例如,如果pv的输入不是文件,并且没有手动指定特定大小,则进度条会从左向右前进以显示活动,但是如果没有基线,它无法衡量完成百分比。 这是一个例子:

$ ssh faraway tar cf - projectx | pv --wait > projectx.tar
Password:
4.34MB 0:00:07 [ 611kB/s] [      <=>                  ]

本示例在远程计算机上运行tar并将远程命令的输出发送到本地系统以创建projectx.tar。 由于pv无法计算传输中预期的总字节数,因此它显示了到目前为止的吞吐量,经过的时间以及反映活动的特殊指示器。 只要数据流通过,小“ car”( <=> )就从左向右移动。

--wait选项将延迟进度表的渲染,直到实际接收到第一个字节为止。 在此,-- --wait很有用,因为ssh命令可能会提示输入密码。

您可以酌情使用同名标志启用各个指标:

$ ssh faraway tar cf - projectx | \
  pv --wait --bytes > projectx.tar
  Password:
   268kB

后一个命令使用--bytes启用运行字节计数。 其他选项是--progress--timer--eta--rate--numeric 。 如果指定一个或多个显示选项,则会自动禁用所有其余(未命名)的指示器。

pv还有另外一种简单用法。 --rate-limit选项可以限制吞吐量。 此选项的参数是数字和后缀,例如m表示兆字节/秒:

$ ssh faraway tar cf - projectx | \
  pv --wait --quiet --rate-limit 1m > projectx.tar

前面的命令隐藏了所有指示符( --quiet ),并且限制了整个1MB / s的速度。

Pipe Viewer的高级用法

到目前为止,所示示例在一对命令中将Pipe Viewer的单个实例用作生产者或使用者。 但是,更复杂的组合也是可能的。 您可以在同一命令行中多次使用pv ,并附带一些条件。 具体来说,您必须使用--name 命名 pv每个实例,并且必须使用--cursor启用多行模式。 这两个选项结合在一起,创建了一系列带标签的指标,每个命名实例一个指标。

例如,假设您想同时监视数据传输和压缩的进度。 您可以将pv一个实例分配给前一个操作,将另一个分配给后者,如下所示:

$ ssh faraway tar cf - projectx | pv --wait --name ssh | \
  gzip | pv --wait --name gzip > projectx.tgz

键入密码后,Pipe Viewer命令将生成两行进度表:

ssh: 4.17MB 0:00:07 [ 648kB/s] [     <=>             ]
       gzip:  592kB 0:00:06 [62.1kB/s] [   <=>               ]

第一行标记为ssh ,显示了传输进度; 第二行标记为gzip ,显示压缩的进度。 由于每个命令无法确定其各自操作中的字节数,因此累积的总数和活动条显示在每一行上。

如果您知道或能够近似或计算操作中的字节数,请使用--size选项。 添加此选项可在进度栏中提供一些更详细的细节。

例如,如果您要监视重要归档任务的进度,则可以使用其他UNIX实用程序来估计原始文件的总大小。 df实用程序可以显示整个文件系统的统计信息,而du可以计算任意深度的层次结构的大小:

$ tar cf - work | pv --size `du -sh work | cut -f1` > work.tar

在这里,subshel​​l命令du -sh work | cut -f1 du -sh work | cut -f1以与pv兼容的格式产生工作目录的总大小。 即, du -h产生了一种人类可读的格式,例如17M的17兆字节—与pv完美结合。 ( lsdf命令还支持-h以便于人类阅读。)由于pv现在希望通过管道传输特定数量的字节,因此它可以呈现真实的进度条:

700kB 0:00:07 [ 100kB/s] [>                    ]  4% ETA 0:02:47

最后,您肯定会发现另一种有用的技术。 除了计数字节外,Pipe Viewer还可通过计数行来可视化进度。 如果指定修饰符--line-mode ,则每次遇到换行符时, pv使进度表前进。 您还可以提供--size ,该数字将解释为预期的行数。

这是一个例子。 通常, find有助于在大海捞针中定位针,例如在大型应用程序代码中定位特定系统调用的所有用途。 在这种情况下,您可能会运行以下内容:

$ find . -type f -name '*.c' -exec grep --files-with-match fopen \{\} \; > results

如果字符串fopen出现在文件中的任何位置,此代码将查找所有C源文件并发出文件的名称。 输出收集在名为results的文件中。 要反映活动,请将pv添加到混合中:

$ find . -type f -name '*.c' -exec grep --files-with-match fopen \{\} \; | \
  pv --line-mode > results

行模式是惊人的,因为许多UNIX命令(例如find )对文件的元数据进行操作,而不对文件的内容进行操作。 对于复制或压缩大量文件的系统管理脚本,行模式是理想的选择。

通常,只要速率可测量,就可以将Pipe Viewer注入命令行和脚本中。 不过,您可能必须要有创造力。 例如,要测量复制目录的速度,请从cp -pr切换到tar

$ # an equivalent of cp -pr old/somedir new
$ (cd old; tar cf - somedir) | pv | (cd new; tar xf - )

您可能还考虑将行模式与wgetcurlscp等网络实用程序一起使用。 例如,您可以使用pv来衡量大量上载的进度。 并且由于许多联网工具都可以从文件中获取输入,因此您可以将文件的长度用作--size的参数。

一点宝石

管道查看器是那些鲜为人知的瑰宝之一,一旦找到它,您将无法回忆起没有它的生活。 您可能会在日常命令行使用中找到pv某些应用程序,但是在自动化脚本中可能会发现许多pv的用途。 现在,您可以插入一个探针来为您提供实时反馈,而不必盯着闪烁的光标耐心等待一切正常的指示。 Pipe Viewer为机器增添了动感。


翻译自: https://www.ibm.com/developerworks/aix/library/au-spunix_pipeviewer/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值