使用xargs跟踪进度


11

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

cat <someinput> | xargs -n 1 -P 5 <somecmd>

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

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

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

Answers:


13

如果您具有GNU Parallel,则可以运行:

cat <someinput> | parallel --bar -P 5 <somecmd>

GNU Parallel是一个通用的并行器,使在ssh可以访问的同一台计算机或多台计算机上并行运行作业变得容易。

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

简单的调度

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

GNU并行调度

安装

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

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

有关其他安装选项,请参见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


1
非常感谢(提供答案和编写软件!),它很棒!
格雷格·萨德斯基

9

您可以使用pv:

cat <someinput> | pv -p -s sizeof_someimput | xargs -n 1 -P 5 <somecmd>

有了它,您将知道读数的位置,因此您将大致了解对读数的位置。


1
另一个常见用例可能是与find结合使用:FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
mxmlnkn

3

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.