【问题标题】:Monitoring progress within xargs在 xargs 中监控进度
【发布时间】:2017-01-23 11:54:24
【问题描述】:

有没有办法跟踪或监控xargs 内的进度?

我将for 循环替换为find … | xargs 以提高性能(特别是并行运行任务)。我读过parallel 有一个进度标志,但我想知道是否有办法严格使用xargs 来完成这项工作。

我还知道,通过xargs 并行运行的任务不一定会以正确的顺序完成,这加剧了监控进度的复杂性。即使一个解决方案能让我大致了解进展情况,那也是一个很好的开始。

【问题讨论】:

  • 文件数量方面的进展?
  • 我的印象是xargs 的新功能引起了一些关注。因此,在一个操作系统/版本环境中可能正确的情况在您当前的环境中可能并不正确。你仔细阅读你的man xargs了吗?此外,仅使用正确构造的ps cmd(同样是man ps)可能会给您很多线索。我当前的操作系统有pstee,这可能会有所帮助。祝你好运!
  • 是的,我想根据处理的文件数(完成百分比)来监控进度。我正在通过压缩过程运行大量图像。我也在运行 OS X,它安装了相当有限的 xargs 版本。

标签: bash shell unix xargs


【解决方案1】:

如果你只是想输入你已经粗略处理了多少行,你可以创建简单的 shell 函数来做到这一点

#!/bin/bash

#-----
##
## @function count
##
## @desc Write every n'th number (if n is 5 write 5, 10, 15, ...)
##
## @param $1 - number 
##
#-----
function count {
   typeset C=0
   while read L; do
      C=$(( C + 1 ))
      if [ $(( $C % $1 )) -eq 0 ]; then
         echo $C 1>&2
      fi
      echo "$L"
   done
}

find . | count 100 | xargs ...

小问题是这会打印传递给 xargs 的行数,而不是 xargs 调用的命令已经处理的行数。再加上每个管道都有一些缓冲区,所以它会显示比它应该显示的略高的数字。在我的机器上,它提前约 500 行显示为真实状态,但如果您处理的行数足够多,则 500 行可以忽略不计 :)

【讨论】:

    【解决方案2】:

    如果您只是在寻找进度的一般指示,最简单的方法是在执行您想要执行的命令之前回显。

    示例: cat <someinput> | xargs -I{} sh -c 'echo {}; <somecmd>;'

    -I{}{} 设置为当前正在处理的字符串

    sh -c 将允许您执行多个命令(注意:每个命令后都需要分号包括最后一个

    【讨论】:

      【解决方案3】:

      您可以使用pv 来监控管道(虽然不是文件,因为它位于您的管道中)但是您必须告诉pv find 输出的大小,这看起来很麻烦(请参阅this answer)。

      我真的建议您使用 parallel,这取决于您要完成的工作......这正是它的设计目的。

      否则,如果您安装了 Apple Developer Tools,您可以编写一个小脚本来生成 Makefile 来完成相同的任务,并确保它以您想要的方式打印进度。

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        相关资源
        最近更新 更多