Bash脚本等待分叉的子进程完成

时间:2015-12-23 19:05:29

标签: bash loops process wait child-process

我有一个脚本,在处理它们的文件夹结构中迭代JPG文件。

为了加快速度,我已经分配了这样的处理任务:

#!/bin/sh
SECONDS=0 #Start the clock!

myloop () {
    local run=$1
    jpeg-transform "$file"
    stripexif "$file"
    ...other commands...
}

find /user/dan/testjpgs -name '*.jpg' -print0 | while read -d $'\0' file
    do myloop "$run" & #fork myloop
    done    

duration=$SECONDS
echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."

问题是脚本结束后的持续时间计算是在脚本执行后立即发生的。它不是在等待子进程完成,只是返回'零秒已过去'。

我尝试在do ... done循环之后插入“wait”命令,但它没有任何效果。

1 个答案:

答案 0 :(得分:1)

我使用GNU parallel命令解决了这个问题,效果很好,并且还将子进程扩展到可用的CPU核心数。我敢肯定它可以用纯粹的bash完成,但这对我来说看起来更优雅。

#!/bin/sh
SECONDS=0 #Start the clock!

myloop () {
    command
    command
    command
}
export -f myloop

find . -name '*.jpg' | parallel myloop {}

duration=$SECONDS
echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."