0

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

设置 SGE 以在不同节点上运行具有不同输入文件的可执行文件

就像我在那个帖子中所说的那样,我之前在 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 作业而不知道是否有任何未知作业在中间死去(而且我从来不知道它死在哪里)。

请在这件事上给予我帮助!非常感谢您的帮助!非常感谢您!

4

1 回答 1

0

您能否更具体和清楚地说明您遇到的问题。我认为您提到的最后一个问题主要涉及wrap.shjobN.sh脚本,即使用作业数组。

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

要让作业等待另一个作业完成,请使用该qsub选项-hold_jid。要将其应用于多个作业,每个作业都依赖于前一个来完成,我首先想到的是一个 for 循环。例如:

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 

我很高兴编辑此回复以进一步帮助您。

于 2015-04-06T15:01:24.550 回答