如何等待本身在线程中运行其他任务的并行化 bash 命令?(doxygen & dot)



我在Mac OS X上使用下面的bash脚本在大约10个源代码库上运行氧原子。

问题是,氧运行最耗时的任务"点"(创建类图)在单独的线程上自己。这将导致wait命令不等待点线程完成。它有效地将我立即返回到命令提示符(使用氧创建文档很快),而dot仍然在后台生成类图,大约需要一分钟左右。

#!/bin/bash
DOXY="/Applications/Doxygen.app/Contents/Resources/doxygen"
#run doxygen on all configs
for config in doxygen*.config
do
    $DOXY $config &
done
wait

我试过强制点运行在一个线程(DOT_NUM_THREADS=1),但这没有帮助。我试着在循环中放入wait命令,但这只会占用没有并行化的时间,并且仍然不会等待dot完成。

我需要等待点命令生成所有的类图,否则我将在下一步打包/上传不完整的文档。

我如何并行氧,并让它等待所有线程点命令完成?

或者,是否有一种方法让我确定在bash脚本中,如果所有的点命令已经结束(我不知道什么进程/线程氧实际上产生,也不知道如何等待他们)?

更新:我尝试使用xargs,它可以正确地等待所有点线程完成,但并没有更快:

find . -name "doxygen*.config" | xargs -n 1 -P 8 doxygen

这里的问题是我不能设置'n' (number)大于1,因为那样氧不会创建所有的文档集,因为它忽略了额外的参数

看一下这里https://stackoverflow.com/a/8247993/784672,我在这里描述了一种使用标记文件和GNU并行实用程序并行运行氧原子的方法。

我找到了一个解决方案。但首先,我是一个傻瓜,我相信我可以加速氧气。我已经提到氧气是最耗时的任务(点)。因此:咄!:)

无论如何,对我有用的是用doxygen命令创建另一个bash脚本:

#!/bin/bash
DOXY="/Applications/Doxygen.app/Contents/Resources/doxygen"
echo Making $1 …
$DOXY $1

然后原始bash脚本可以并行化任务,并正确等待dot完成:

#!/bin/bash
#run doxygen on all configs
for config in doxygen*.config
do
    ./make-doc.sh $config &
done
wait

我认为另一个解决方案(没有测试,因为我没有安装doxygen),就是在后台的子shell中运行doxygen作为前台任务。这与您找到的解决方案几乎相同,但不需要创建第二个脚本:

for config in doxygen*.config; do
    ( $DOXY $config ) &
done
wait

最新更新