我目前有当前的脚本。
#!/bin/bash
# script.sh
for i in {0..99}; do
script-to-run.sh input/ output/ $i
done
我希望使用xargs并行运行它。我试过了
script.sh | xargs -P8
但是上面只执行了一次。也没有运气-n8。 添加&在脚本for循环中执行的行的末尾将尝试一次运行脚本99次。如何在当时仅执行8次循环,最多100次。
答案 0 :(得分:86)
来自xargs
手册页:
本手册页记录了xargs的GNU版本。 xargs读取项目 来自标准输入,由空格分隔(可以保护 使用双引号或单引号或反斜杠)或换行符,并执行 任何初始命令(默认为/ bin / echo)一次或多次 参数后跟从标准输入读取的项。空白行 标准输入被忽略。
这意味着您的示例xargs
正在等待并收集脚本中的所有输出,然后运行echo <that output>
。不完全是有用的,也不是你想要的。
-n
参数是输入中要使用的每个命令使用的项目数(这里没有任何关于并行性的内容)。
要使用xargs
做你想做的事,你需要做更像这样的事情(未经测试):
printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/
这样就崩溃了。
printf %s\\n {0..99}
- 从0
到99
每行打印一个号码。xargs
答案 1 :(得分:48)
使用GNU Parallel,您可以:
parallel script-to-run.sh input/ output/ {} ::: {0..99}
如果不想要为每个CPU内核运行一个作业,请添加-P8
。
与xargs
相反,它会做正确的事情,即使输入包含空格,&#39;或&#34; (不是这里的情况)。它还确保不同作业的输出不会混合在一起,因此如果您使用输出,则可以保证您不会从两个不同的作业中获得半个行。
GNU Parallel是一个通用的并行程序,可以很容易地在同一台机器上或在你有ssh访问权限的多台机器上并行运行作业。
如果要在4个CPU上运行32个不同的作业,并行化的直接方法是在每个CPU上运行8个作业:
GNU Parallel会在完成后生成一个新进程 - 保持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
观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
完成教程:http://www.gnu.org/software/parallel/parallel_tutorial.html
注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel
答案 2 :(得分:1)
您可以使用这个简单的 1 行命令
seq 1 500 | xargs -n 1 -P 8 script-to-run.sh input/ output/