使用 xargs 跟踪进度

Utk*_*nha 11 command-line-interface xargs

我正在使用 xargs 在一组输入参数上执行命令,如下所示:

cat <someinput> | xargs -n 1 -P 5 <somecmd>
Run Code Online (Sandbox Code Playgroud)

输入文件真的很长,需要很长时间才能运行。所以我只是在等待命令提示符出现。有没有办法显示已完成的输入参数数量的进度条?

我尝试使用“bar”,但我总是得到“无限”的吞吐量。似乎 xargs 在执行命令之前读取整个输入。

http://i.stack.imgur.com/5Wsgx.gif

Ole*_*nge 13

如果你有 GNU Parallel 你可以运行:

cat <someinput> | parallel --bar -P 5 <somecmd>
Run Code Online (Sandbox Code Playgroud)

GNU Parallel 是一个通用的并行器,可以很容易地在同一台机器或您可以 ssh 访问的多台机器上并行运行作业。

如果您有 32 个不同的作业要在 4 个 CPU 上运行,一个直接的并行化方法是在每个 CPU 上运行 8 个作业:

简单的调度

GNU Parallel 会在完成后生成一个新进程 - 保持 CPU 处于活动状态,从而节省时间:

GNU 并行调度

安装

个人安装不需要 root 访问权限。这样做可以在 10 秒内完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Run Code Online (Sandbox Code Playgroud)

有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解更多

查看更多示例:http : //www.gnu.org/software/parallel/man.html

观看介绍视频:https : //www.youtube.com/playlist? list =PL284C9FF2488BC6D1

演练教程:http : //www.gnu.org/software/parallel/parallel_tutorial.html

注册电子邮件列表以获得支持:https : //lists.gnu.org/mailman/listinfo/parallel


DrG*_*ill 9

您可以使用 pv :

cat <someinput> | pv -p -s sizeof_someimput | xargs -n 1 -P 5 <somecmd>
Run Code Online (Sandbox Code Playgroud)

有了这个,您将知道someimput的读取位置,因此您将大致了解someimput的处理位置

  • 另一个常见的用例可能是与 find 的组合:`FIND=( find "$DIR" -type f ) &amp;&amp; ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 &lt;somecmd&gt;` (2认同)
  • 使用这种方法时遇到的问题是管道缓冲区消耗了 cat 命令的整个输入,显示“完整”进度条,而 xargs 命令刚刚开始 (2认同)

小智 7

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

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

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

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