如何将bash命令列表提供给xargs以并行运行?

时间:2019-07-30 07:27:58

标签: bash parallel-processing xargs

我想在不同数量的输入文件上并行运行程序的几个实例。该程序本身未并行化,这就是为什么我正在寻找一种提交多个实例的方法的原因。我知道GNU parallel,但是我正在编写的bash脚本将与我的同事共享,并且并非所有人都安装了它。

我找到了一个几乎符合我的需求here的答案,但是那里的进程数是硬编码的,所以我不能使用here文档。就我而言,输入文件的数量将有所不同,因此我认为可以列出它们,然后馈入xargs来执行它们。我尝试了各种方法,但是它们都不起作用。我两次尝试通过链接修改代码:

#!/bin/bash
nprocs=3
# Attempt one: use a loop
commands=$( for ((i=0; i<5; i++)); do echo "sleep $i; echo $i;"; done )
echo Commands:
echo $commands
echo
{
    echo $commands | xargs -n 1 -P $nprocs -I {} sh -c 'eval "$1"' - {}
} &
echo "Waiting for commands to finish..."
wait $!

# Attempt two: use awk, the rest as above
commands=$( awk 'BEGIN{for (i=1; i<5; i++) { printf("sleep %d && echo \"ps %d\";\n", i, i) }}' )

一个接一个地执行命令。有什么事吗谢谢。

2 个答案:

答案 0 :(得分:2)

尝试仅运行

xargs -n 1

查看正在运行的命令。

为避免引用问题,我将使用一系列命令。

#! /bin/bash
nprocs=3

commands=()
for i in {0..4} ; do
    commands+=("sleep 1; echo $i")
done

echo Commands:
echo "${commands[@]}"

printf '%s\n' "${commands[@]}" \
| xargs -n 1 -P $nprocs -I % bash -c % &

echo "Waiting for commands to finish..."
wait $!

答案 1 :(得分:1)

parallel --embed(版本> 20180122)适合您的情况:

parallel --embed > newscript.sh

现在编辑newscript.sh的最后几行,您便可以在脚本中包含GNU Parallel了。