2015-02-06 103 views
36

我目前拥有当前脚本。使用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个。

+4

使用GNU并行 – Barmar 2015-02-06 03:20:51

+0

这就是我最初想做的事,却不得不因为我是在Windows上诉诸xargs的。我无法在Windows上运行GNU Parallel – Olivier 2015-02-06 03:21:36

+0

这个脚本是自称还是只是在你问这里时混淆了名字? – 2015-02-06 03:24:05

回答

50

xargs手册页:

本手册页文档的xargs GNU版本。 xargs的读取来自标准输入项目 ,由坯件(其可以被保护 与双或单引号或反斜杠)或换行符界定,并执行 命令(默认为/ bin中/回波)与任何初始一次或多次 - 参数后跟从标准输入读取的项目。 上的空白行将被忽略。

这意味着对于您的示例,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
    • 采取最多每次运行命令行一个参数
    • 和运行高达八道工序在同一时间
+3

其实你不需要把参数放在单独的行上; xargs单词分裂。所以'echo {0..99} |'也可以。 '<<< {0..99}'似乎不起作用;虽然'<<< word'被记录为大括号的单词,但它不适用于任何版本的bash,我已经得心应手。 – rici 2015-02-06 03:41:33

+1

@rici看起来像一个文档错误,特别是因为Here Documents *的文档没有提及大括号扩展(在快速测试中它不会发生),尽管它们也没有提及代字符扩展(它不会'''不会发生在'<<'上,但''''如此'*耸肩*')。在这里的文档和这里的字符串的扩展不会发生在我的脑海里有点奇怪。 – 2015-02-06 03:49:12

+0

如何将不同运行的结果与例如换行? – 2017-10-08 00:48:07

35

随着GNU并行你会怎么做:

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

添加在-P8如果你不希望运行每个CPU核心一个作业。

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

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

如果你想在4个CPU上运行32个不同的工作岗位,并行化直接的方式是在每个CPU上运行8个作业:

Simple scheduling

GNU并行,而不是产生一个新的进程时,一个完成 - 保持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

穿过啧啧啧啧orial:http://www.gnu.org/software/parallel/parallel_tutorial.html

订阅邮件列表,以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

+8

这并不回答这个问题,也没有指出为什么xargs不能达到同样的目的。 – 2016-12-30 04:17:50

+2

downvote因为xarg对我来说完全如第二张图片所示。 – noonex 2017-02-07 08:24:06

+0

@noonex您是否知道并非所有人都使用您使用的xargs版本,并且-P不是所有版本的xargs? – 2017-02-07 12:32:25