我试图在以下bash脚本中并行rpw_gen_features
的任务:
#!/bin/bash
maxjobs=8
jobcounter=0
MYDIR="/home/rasoul/workspace/world_db/journal/for-training"
DIR=$1
FILES=`find $MYDIR/${DIR}/${DIR}\_*.hpl -name *.hpl -type f -printf "%f\n" | sort -n -t _ -k 2`
for f in $FILES; do
fileToProcess=$MYDIR/${DIR}/$f
# construct .pfl file name
filebasename="${f%.*}"
fileToCheck=$MYDIR/${DIR}/$filebasename.pfl
# check if the .pfl file is already generated
if [ ! -f $fileToCheck ];
then
echo ../bin/rpw_gen_features -r $fileToProcess &
jobcounter=jobcounter+1
fi
if [jobcounter -eq maxjobs]
wait
jobcounter=0
fi
done
但它在运行时会产生一些错误:
line 20: syntax error near unexpected token `fi'
我不是bash编程方面的专家,所以请随意评论整个代码。
答案 0 :(得分:2)
我很好奇为什么你不只是使用GNU Parallel:
MYDIR="/home/rasoul/workspace/world_db/journal/for-training"
DIR=$1
find $MYDIR/${DIR}/${DIR}\_*.hpl -name *.hpl -type f |
parallel '[ ! -f {.}.pfl ] && echo ../bin/rpw_gen_features -r {}'
甚至:
MYDIR="/home/rasoul/workspace/world_db/journal/for-training"
parallel '[ ! -f {.}.pfl ] && echo ../bin/rpw_gen_features -r {}' ::: $MYDIR/$1/$1\_*.hpl
它似乎更具可读性,当您从8核移动到64核机器时,它会自动扩展。
观看介绍视频以获得快速介绍: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
完成教程(man parallel_tutorial)。你命令行 爱你吧。
答案 1 :(得分:1)
您在变量周围缺少then
,空格和${}
:
if [jobcounter -eq maxjobs]
wait
jobcounter=0
fi
应该是
if [ ${jobcounter} -eq ${maxjobs} ]; then
wait
jobcounter=0
fi
此外,您需要仔细检查您的脚本,因为我可以看到许多人遗漏${}
,例如:
jobcounter=jobcounter+1
即使您正确使用变量,这仍然无效:
jobcounter=${jobcounter}+1
将屈服:
1
1+1
1+1+1
而不是你所期望的。你需要使用:
jobcounter=`expr $jobcounter + 1`
从不使用BASH版本,您应该可以:
(( jobcounter++ ))