设置SGE以在不同节点上运行具有不同输入文件的可执行文件(更新:有一些问题)

时间:2015-04-03 04:43:24

标签: bash shell scripting sungridengine slurm

我知道我之前从这个链接问了同样的问题:

Setting SGE for running an executable with different input files on different nodes

就像我在那个帖子中所说的那样,我之前在SLURM系统上使用过这种东西没有任何问题,因为所有内容都包含在一个提交脚本中。但是,根据上面链接中的上一个问题进行调整,这是我在SGE上的方法(我知道这是一个不好的做法,但我真的想不出更好的方法......)

该作业通过4 + N个脚本链接:run.shsubmitSerial.shwrap.shtemp.shjob{1-N}.sh

  

run.sh:主要工作脚本

#!/bin/bash

...some stuffs...
...create N directories to run N input files in parallel (like last problems)
...generate wrap.sh and job{1-N}.sh...

...parameters definition...

for (( i=0; i<=M; i++ ))
do
   ...generate submitSerial.sh...
   sh submitSerial.sh
   ...initialize boolean flag...
   while flag
   do
      sh wrap.sh
      ...run an executable to determine the flag status...
   done
done

...some cleanup...
  

submitSerial.shtemp.sh:我需要先串行执行此可执行文件,   并希望群集等到完成后再继续下一步   run.sh中的程序行。由于run.sh不在群集中   环境(即没有Grid Engine参数),而是仅存在   在登录节点中,这将生成temp.sh并运行串行脚本   通过qsub马上。既然我不知道怎么检查一个   qsub工作完成了,所以我不得不以愚蠢的方式去做。不知道有没有   一个更好的检查方法?

#!/bin/bash

echo "#!/bin/bash" >> $workDir/temp.sh
echo >> $workDir/temp.sh
echo "#$ -N serialForce" >> $workDir/temp.sh
echo "#$ -q batch.q" >> $workDir/temp.sh
echo "#$ -l h_rt=0:10:00" >> $workDir/temp.sh
echo "#$ -pe orte 120" >> $workDir/temp.sh
echo "#$ -wd /path/to/working/dir/" >> $workDir/temp.sh
echo "#$ -j y" >> $workDir/temp.sh
echo "#$ -S /bin/bash" >> $workDir/temp.sh
echo "#$ -V" >> $workDir/temp.sh
echo >> $workDir/temp.sh
echo "mpirun -np 120 nwchem-6.5 $workDir/step0_1.nw" >> $workDir/temp.sh

qsub $workDir/temp.sh

while true
do
   qstat > $workDir/temp
   if [ -s $workDir/temp ]
   then
      sleep 1
   else
      rm $workDir/temp
      break
   fi
done

rm $workDir/temp.sh
  

wrap.shjob{1-N}.sh:这是在开头的早期生成的   的脚本。这是我上一次问题的一部分,而我   还使用sleep来检查qsub状态

#!/bin/bash

for i in {1..10}
do
   qsub $workDir/wd$i/job$i.sh
done

while true
do
   qstat > $workDir/temp
   if [ -s $workDir/temp ]
   then
      sleep 1
   else
      rm $workDir/temp
      break
   fi
done

for j in {1..10}
do
   rm $workDir/wd$j/*
done

这种方法的问题是,一旦我运行run.sh,我无法在后台执行此操作,并且必须单独执行qsub,如果群集已满,则存在潜在问题。我想知道是否有一个解决方案,只有一个qsub像SLURM方法?我只是想提交这份工作,只是等到它完成,而不是让脚本提交多个qsub工作,而不知道中间是否有任何未知的工作死亡(而且我从来不知道它死在哪里)。

请帮帮我!非常感谢您的帮助!非常感谢你提前!

1 个答案:

答案 0 :(得分:0)

请您更具体,更明确地了解您遇到的问题。我看来你提到的最后一个问题主要是解决wrap.shjobN.sh脚本,即使用作业数组。

要解决您的其他问题,即如何检查/等待工作完成,请参阅下文。

要让作业等待其他作业完成,请使用qsub选项-hold_jid。要将此应用于多个作业,每个作业都依赖于前一个作业来完成,我的第一个想法就是for循环。 E.g:

holdid=$(echo "<some code for job 1>" | qsub -terse)
for jobn in {1..99}
do
   holdid=$(echo "<some code for jobn>" | qsub -terse -hold_jid ${holdid})
done 

我很乐意编辑此回复以帮助您进一步了解。