运行 使用 xargs 并行执行程序

Running programs in parallel using 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个。

来自 xargs 手册页:

This manual page documents the GNU version of xargs. xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times with any initial- arguments followed by items read from standard input. Blank lines on the standard input are ignored.

这意味着对于您的示例,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
    • 每个运行命令行最多一个参数
    • 和运行 一次最多 八个进程

使用 GNU Parallel 你会做:

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

如果您想要运行每个CPU核心一个作业,请添加-P8

相反 xargs 它会做正确的事情,即使输入包含 space、' 或 "(虽然这里不是这种情况)。它还确保来自不同的输出作业不会混合在一起,所以如果你使用输出,你可以保证你不会从两个不同的作业中得到半行。

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

如果您有 32 个不同的作业要 运行 在 4 CPU 秒内执行,一个直接的并行化方法是 运行 每个 CPU 8 个作业:

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

安装

如果 GNU Parallel 未打包用于您的发行版,您可以进行个人安装,这不需要 root 访问权限。这样做可以在 10 秒内完成:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a
12345678 883c667e 01eed62f 975ad28b 6d50e22a
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
cc21b4c9 43fd03e9 3ae1ae49 e28573c0
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
$ bash install.sh

有关其他安装选项,请参阅 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

您可以使用这个简单的 1 行命令

seq 1 500 | xargs -n 1 -P 8 script-to-run.sh input/ output/