このリンクから以前に同じ質問をしたことは知っています:
異なるノードで異なる入力ファイルを使用して実行可能ファイルを実行するための SGE の設定
そのスレッドで言ったように、すべてが 1 つの送信スクリプトにラップされているため、以前は 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 パラメーターがない)、ログイン ノードにのみ存在するため、qsub を介してシリアル スクリプトが生成され、temp.sh
すぐに実行されます。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
andjob{1-N}.sh
: これは、スクリプトの開始時に以前に生成されたものです。前回質問した部分ですが、qsubの状態もsleepで確認してみました
#!/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 アプローチのような1 つだけのソリューションがあるのだろうか? 途中で不明なジョブが終了するかどうかを知らずにスクリプトに複数の qsub ジョブを送信させるのではなく、ジョブを送信して完了するまで待ちたいだけです (どこで終了するかわかりません)。
これで私を助けてください!あなたの助けは大歓迎です! 事前にどうもありがとうございました!