使用 xargs 并行运行程序

问题描述 投票:0回答:3

我目前有当前脚本。

#!/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 个。

bash parallel-processing xargs
3个回答
190
投票

来自

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
    • 每次运行命令行最多使用一个参数 并同时运行
    • 最多
    • 八个进程

18
投票
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) 手册


9
投票

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

	
© www.soinside.com 2019 - 2024. All rights reserved.