【发布时间】:2021-06-03 20:30:54
【问题描述】:
我正在尝试在 bash 中使用 GNU 并行来并行运行程序的多个实例,每个实例具有不同的参数。此外,我希望能够从文件中读取这些参数,并让脚本等待所有并行化作业完成。 GNU parallel 的 parallel --semaphore,又名 sem,似乎是一种简单的方法。
MCVE
使用来自sem 文档的basic example 的修改版本,我创建了一个最小的测试用例来说明我的问题:
while read i; do
echo -n "$i "
sem -j 4 "sleep $i && echo $i finished"
done < args.txt
echo
echo 'Started wait'
sem --wait
echo 'Done waiting'
这里,args.txt 是一个文件,它只包含:
1
2
3
4
预期与实际产出
我希望看到类似于以下内容的输出:
user@host:~$ ./test-sem.sh
1 2 3 4
Started wait
1 finished
2 finished
3 finished
4 finished
Done waiting
然而,令人惊讶的是,sem --wait 实际上并没有等待任务完成,而是得到如下输出:
user@host:~$ ./test-sem.sh
1 2 3 4
Started wait
Done waiting
user@host:~$ 1 finished
2 finished
3 finished
4 finished
也就是说,脚本执行并终止,然后sem作业在后台运行并打印它们各自的输出!为什么会这样?在 while 循环内初始化所有 sem 作业后,如何让 sem --wait 实际等待?
有趣的是,从文件中读取是导致问题的原因,而不是 while 循环本身。也就是说,以下内容按预期工作:
i=1;
while (( $i <= 4 )); do
echo -n "$i "
sem -j 4 "sleep $i && echo $i finished"
let i=i+1
done
echo
echo 'Started wait'
sem --wait
echo 'Done waiting'
但我的实际用例有一个包含更复杂参数组合的文件,所以我真的很想从文件中读取参数。
【问题讨论】:
标签: bash parallel-processing gnu-parallel