我有一个脚本,在处理它们的文件夹结构中迭代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”命令,但它没有任何效果。
答案 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."