会计考友 发表于 2012-8-4 12:07:07

Linux辅导:用PipeViewer跟踪长时间操作的进度

UNIX 中最巧妙最壮大的功能之一是 shell。shell 比 GUI 高效得多,还可以经由过程编写剧本自动执行良多使命。更好的是,管道操作符可以在呼吁行上组装出专门的轨范。管道按顺序把呼吁毗连起来,前一个呼吁的输出作为后一个呼吁的输入。   常用缩写词
  GUI:Graphical user interface
  可是,管道有一个大错误谬误:泥像是黑箱子。如不美观把呼吁毗连在一路,那么只有序列中最后一个呼吁生成的输出能够反映管道的进度。当然,可以在序列中插入 tee,还可以用 tail 查看输出文件的增添,可是这些解决方案都不完美,会把多个阶段的尺度输出 (stdout) 和尺度错误 (stderr) 混在一路。此外,这两个解决方案斗劲粗拙,很可能无法剖明每个轨范所需的计较劲。
  当然,可以把复杂的序列分化为多个零丁的轨范,每个轨范有自己的中心输出文件。简直,如不美观但愿搜检每个轨范的结不美观,分化是最理想的体例。编写一个剧本,为每个轨范生成一个数据文件,在每对轨范之间使用数据文件作为输入,以最后的文件作为最终结不美观。可是,这种做法华侈了呼吁行的矫捷性。
  我们需要的是一个可以嵌入呼吁行中的进度怀抱工具。理想情形下,可以对每个轨范一再使用这个工具,它应该是开放源码的,可以移植到 Linux? 和 Mac OS X 等多种 UNIX 变体上。
  好了,不必再盼愿了:Pipe Viewer (pv) 就是这样的工具。它由系统打点员 Andrew Wood 编写,经由其他良多开发人员改良,前后历时四年。它供给了探察呼吁行管道的能力。它的 项目页面 上说,pv “可以插入管道中两个历程之间,从而显示传递数据的速度、已经破耗的时刻以及残剩时刻。” 更惹人注目的是,可以在统一个呼吁行中插入多个 pv 实例以显示相对吞吐量。
  本文介绍若何在 UNIX 系统上构建 pv,以及若何在简单和复杂的呼吁行组合中应用它。可是,我们首先回首回头回忆一下管道毗连历程的体例。
  UNIX 管道:历程的毗连
  
  首先,在第一阶段,初始历程从尺度输入 stdin 篡夺数据,把输出写到 stdout,把错误发送到 stderr。stdin、stdout 和 stderr 都是文件描述符,即文件的句柄。文件句柄上的每个操作(例如 open、read、write、rewind、truncate 和 close)影响文件的状况。
  接下来,在第二阶段,初始历程建树一个管道。管道由一个队列和两个文件描述符(一个用于数据入列,另一个用于数据出列)组成。管道是祖先先出 (FIFO) 数据结构。
  管道自己没什么用;它的浸染是毗连数据生成者和数据消费者。是以,初始历程在第三阶段生成就建树)第二个历程,它作为数据消费者。
  在第四阶段(假设新的历程是消费者),原本的历程把它的 stdout 替代为管道的生成者端,让刚生成的历程毗连管道的消费者端,以它作为自己的 stdin。经由这些调整之后,原本的历程(此刻的生成者)执行的每个 write 操作都进入队列,然后由新历程(此刻的消费者)篡夺。
  在使用呼吁行管道操作符 (|) 毗连两个适用轨范时,shell 就是采用第一到第四阶段这样的过程,可是 shell 为每个适用轨范生成新历程,其自己并不执行功课节制。
页: [1]
查看完整版本: Linux辅导:用PipeViewer跟踪长时间操作的进度