尝试并行bash脚本任务时出错

时间:2014-01-04 20:26:05

标签: bash parallel-processing

我试图在以下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编程方面的专家,所以请随意评论整个代码。

2 个答案:

答案 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++ ))