使用 xargs 跟踪进度

使用 xargs 跟踪进度

我正在使用 xargs 对一组输入参数执行如下命令:

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

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

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

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

答案1

如果您有 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

答案2

您可以使用 pv :

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

有了它,你就会知道阅读一些输入是,所以你会知道治疗一些输入是。

答案3

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

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

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

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

相关内容