使用xargs并行运行程序

时间:2015-02-06 03:15:15

标签: bash parallel-processing 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。 添加&在脚本for循环中执行的行的末尾将尝试一次运行脚本99次。如何在当时仅执行8次循环,最多100次。

3 个答案:

答案 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} - 从099每行打印一个号码。
  • 运行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个作业:

Simple scheduling

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

GNU Parallel scheduling

<强>安装

如果没有为您的发行版打包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/