我知道我之前从这个链接问了同样的问题:
Setting SGE for running an executable with different input files on different nodes
就像我在那个帖子中所说的那样,我之前在SLURM系统上使用过这种东西没有任何问题,因为所有内容都包含在一个提交脚本中。但是,根据上面链接中的上一个问题进行调整,这是我在SGE上的方法(我知道这是一个不好的做法,但我真的想不出更好的方法......)
该作业通过4 + N个脚本链接:run.sh
,submitSerial.sh
,wrap.sh
,temp.sh
和job{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.sh
和temp.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.sh
和job{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工作,而不知道中间是否有任何未知的工作死亡(而且我从来不知道它死在哪里)。
请帮帮我!非常感谢您的帮助!非常感谢你提前!
答案 0 :(得分:0)
请您更具体,更明确地了解您遇到的问题。我看来你提到的最后一个问题主要是解决wrap.sh
和jobN.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
我很乐意编辑此回复以帮助您进一步了解。