我目前有当前脚本。
#!/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
手册页:
本手册页记录了 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
find
结合并行运行命令的示例:
find -name "*.wav" -print0 | xargs -0 -t -I % -P $(nproc) flac %
-print0
使用空字节而不是换行符终止文件名,因此我们可以在 xargs 中使用
-0
来防止带有空格的文件名被视为两个单独的参数。-t
表示详细,使 xargs 打印它正在执行的每个命令,可能很有用,如果不需要,请删除。
-I %
表示用从标准输入读取的参数替换命令中出现的
%
。-P $(nproc)
表示最多并行运行命令的
nproc
实例(nproc
打印可用处理单元的数量)。flac %
是我们的命令,之前的
-I %
意味着这将变成flac foo.wav
另请参阅:xargs(1) 手册
seq 1 500 | xargs -n 1 -P 8 script-to-run.sh input/ output/