使用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}
– 从0
到99
每行打印一个数字。 - 运行
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 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