使用xargs并行运行程序

我目前有当前的脚本。

#!/bin/bash # script.sh for i in {0..99}; do script-to-run.sh input/ output/ $i done 

我希望使用xargs并行运行它。 我努力了

 script.sh | xargs -P8 

但是这样做只能在当时执行一次。 没有运气与-n8以及。 在循环的脚本中添加&要在脚本中执行的行将尝试一次运行脚本99次。 我该如何执行循环只有8时,总共达100。

xargs手册页:

本手册页logging了xargs的GNU版本。 xargs从标准input中读取项目,由空格(可以使用双引号或单引号或反斜线进行保护)或换行符进行分隔,然后使用任何初始参数执行一次或多次命令(默认为/ bin / echo)从标准input中读取项目。 标准input上的空行会被忽略。

这意味着对于您的示例, xargs正在等待并收集脚本的所有输出,然后运行echo <that output> 。 不完全是有用的,也不是你想要的。

-n参数是input中有多less项用于每个运行的命令(本身没有关于并行性的内容)。

xargs做你想做的事情,你需要做更多的事情(未经testing):

 printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/ 

这样就打破了

  • printf %s\\n {0..99} – 从099每行打印一个数字。
  • 运行xargs
    • 每运行一个命令行最多一个参数
    • 并一次运行多达 8个进程

使用GNU Parallel,你可以这样做:

 parallel script-to-run.sh input/ output/ {} ::: {0..99} 

如果您不想在每个CPU内核上运行一个作业,请添加-P8

xargs相反,它会做正确的事情,即使input包含空格,“或”(尽pipe这里不是这样),它也确保不同作业的输出不会混合在一起,所以如果使用输出保证你不会从两个不同的工作中获得半职。

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

如果你想在4个CPU上运行32个不同的作业,那么最简单的方法就是在每个CPU上运行8个作业:

简单的调度

当一个完成时,GNU并行会产生一个新的进程 – 保持CPU活动,从而节省时间:

GNU并行调度

安装

如果您的发行版没有打包GNU Parallel,则可以进行个人安装,而不需要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

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

浏览教程: http : //www.gnu.org/software/parallel/parallel_tutorial.html

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