我知道我之前从这个链接问过同样的问题:
设置 SGE 以在不同节点上运行具有不同输入文件的可执行文件
就像我在那个帖子中所说的那样,我之前在 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 作业而不知道是否有任何未知作业在中间死去(而且我从来不知道它死在哪里)。
请在这件事上给予我帮助!非常感谢您的帮助!非常感谢您!