如何将 bash 命令列表并行地提供给 xargs 到 运行?
How to feed a list of bash commands to xargs to run in parallel?
我想 运行 一个程序的多个实例并行处理不同数量的输入文件。该程序本身不是并行的,这就是为什么我正在寻找一种提交多个实例的方法。我知道 GNU parallel,但是我正在编写的 bash 脚本将与我的同事共享,但并非所有人都安装了它。
我找到了一个几乎符合我需求的答案here,但是那里的进程数量是硬编码的,所以我不能使用此处的文档。在我的例子中,会有不同数量的输入文件,所以我想我可以列出它们,然后提供给 xargs 来执行它们。我尝试了各种方法,但都没有奏效。我两次尝试修改 link:
中的代码
#!/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 ""' - {}
} &
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) }}' )
命令一个接一个执行。有什么问题吗?谢谢
试试 运行宁
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 $!
parallel --embed
(版本>20180122)是为您的情况制作的:
parallel --embed > newscript.sh
现在编辑 newscript.sh
的最后几行,您的脚本中包含了 GNU Parallel,您可以分发它。
我想 运行 一个程序的多个实例并行处理不同数量的输入文件。该程序本身不是并行的,这就是为什么我正在寻找一种提交多个实例的方法。我知道 GNU parallel,但是我正在编写的 bash 脚本将与我的同事共享,但并非所有人都安装了它。
我找到了一个几乎符合我需求的答案here,但是那里的进程数量是硬编码的,所以我不能使用此处的文档。在我的例子中,会有不同数量的输入文件,所以我想我可以列出它们,然后提供给 xargs 来执行它们。我尝试了各种方法,但都没有奏效。我两次尝试修改 link:
中的代码#!/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 ""' - {}
} &
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) }}' )
命令一个接一个执行。有什么问题吗?谢谢
试试 运行宁
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 $!
parallel --embed
(版本>20180122)是为您的情况制作的:
parallel --embed > newscript.sh
现在编辑 newscript.sh
的最后几行,您的脚本中包含了 GNU Parallel,您可以分发它。