bash の wait と、SHELXE の条件検討

bashシェルスクリプト内で background job を立ち上げた場合、最後に wait を入れないと、job の完了を待たずにスクリプトが終了してしまう。したがって、job も共倒れになってしまう。

例えば、TORQUE を使って 30 並列で SHELXE の条件検討を行うスクリプトは、以下のようになる。

#!/bin/bash
#PBS -o run_shelxe.stdout
#PBS -e run_shelxe.stderr
#PBS -l nodes=1:ppn=30
#PBS -q smp

for solv in 0.42 0.44 0.46 0.48 0.50 0.52; do
   for reso in 1.6 1.7 1.8 1.9 2.0; do
      for z in 6; do
         ln -s sad.hkl reso$reso-solv$solv-z$z.hkl
         ln -s sad_fa.hkl reso$reso-solv$solv-z${z}_fa.hkl
         ln -s sad_fa.res reso$reso-solv$solv-z${z}_fa.res
         shelxe reso$reso-solv$solv-z$z reso$reso-solv$solv-z${z}_fa -s$solv -a25 -h$z -z$z -d$reso -q -i&
      done
   done
done
wait

残念ながら、同時に起動する job 数を容易に制限する方法はない。一つの方法としては、ジョブを立ち上げる前に fg | wc -l などを確認するループを入れることが考えられる。

なお、1条件ごとに1つのジョブ(TORQUE のほうのジョブ)を入れれば簡単なのだが、同時ジョブ数が制限されているので、1ジョブでたくさん CPU を使ったほうが特なのである。