0

このリンクから以前に同じ質問をしたことは知っています:

異なるノードで異なる入力ファイルを使用して実行可能ファイルを実行するための SGE の設定

そのスレッドで言ったように、すべてが 1 つの送信スクリプトにラップされているため、以前は SLURM システムでこの種のことを問題なく使用していました。ただし、上記のリンクの前の質問から適応して、SGE に関する私のアプローチを次に示します (これが悪い習慣であることはわかっていますが、これ以上の方法は考えられませんでした...)。

ジョブは 4+N 個のスクリプト ( run.shsubmitSerial.shwrap.shtemp.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.shrun.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.shand job{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の実行をしなければならないため、クラスターがいっぱいの場合に問題が発生する可能性があることです。qsubSLURM アプローチのような1 つだけのソリューションがあるのだろうか? 途中で不明なジョブが終了するかどうかを知らずにスクリプトに複数の 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 に答える