运行 使用 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}
- 从 0
到 99
每行打印一个数字。
- 运行
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/
我目前有当前脚本。
#!/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}
- 从0
到99
每行打印一个数字。- 运行
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/