「myJobShellFile.shを使用してcurrentDirectoryでジョブMyJobをキューに送信する」、「この行を「mpiexec ./main input myJobDataFolder 0003」に追加する」の意味など、質問のかなりの数の側面が不明確です。作業が完了し、の関連部分myJobShellFile.sh
、およびその他の詳細。bash
ジョブ送信の各反復で使用する特定のシェルコマンドを一覧表示できる場合は、Pythonの代わりにタグを使用してより良い質問を投稿できます。
次のスクリプトでは、###
あなたが話していることを推測している行の最後にを置きます。で終わる行###
は、実際に行うこととは無関係であるか、擬似コードである可能性があります。とにかく、一般的な考え方は、スクリプトが項目1から5にリストしたことを実行することになっているということです。このスクリプトは、パラメーターを使用して伝える内容を変更する方が簡単であるため、ではなく、言うように変更したことを前提として
い
ますmyJobShellFile.sh
。シェルスクリプトを変更し続けるため。また、次のジョブを送信する前ではなく、送信する前にmaxIterをインクリメントしたいと思うようです。その場合は、行から#を削除します。フォームのmanbashre拡張の「パラメータ拡張」セクション、および「算術拡張」セクションを参照してください。
mpiexec ./main input $1 $2
mpiexec ./main input
mpiexec
t=$((1$maxIter+1)); maxIter=${t#1}
${var#txt}
$((expression))
形。1$maxIter
および同様の形式を使用して、0018
(8は8進数ではないため、有効なbash番号ではない)のようなテキストを。に変更します10018
。
#!/bin/sh
./myJobShellFile.sh MyJob ###
maxIter=0
while true; do
waitforjobcompletion ###
cd ./myJobDataFolder
maxFile= $(ls myJobData* | tail -1)
maxIter= ${maxFile#myJobData.} #Get max extension
# If you want to increment maxIter, uncomment next line
# t=$((1$maxIter+1)); maxIter=${t#1}
cd ..
if [[ 1$maxIter -lt 11000 ]] ; then
./myJobShellFile.sh MyJobDataFolder $maxIter
else
break
fi
done
注:(1)1000回の送信よりも小さい実行でテストするには、11000を10000+nに置き換えます。たとえば、123回の実行を行うには、10123に置き換えます。(2)上記のスクリプトを作成する際に、以前は不明な数の出力ファイルが出力ディレクトリに時々表示されると想定しました。代わりに、実行ごとに1つの出力ファイルが表示され、値0000、0001、0002、0999、1000に対して値ごとに1つの実行を実行する場合は、次のようなスクリプトを使用します。(1000より小さい数値でテストする場合は、1000を(例)0020に置き換えます。これらの数値の先行ゼロは、生成された数値を先行ゼロで埋めるようにbashに指示します。)
#!/bin/sh
for iter in {0000..1000}; do
./myJobShellFile.sh MyJobDataFolder $iter
waitforjobcompletion ###
done
waitforjobcompletion
(3)スーパーコンピューティングリソースでジョブが完了するのを待機している間にスリープするコマンドがシステムにある場合は、上記のスクリプトの代わりにそのコマンドを使用するのが妥当です。jobisrunning
それ以外の場合、ジョブがまだ実行されている場合にtrueを返すコマンドがシステムにある場合はwaitforjobcompletion
、次のようなものに置き換えます。
while jobisrunning ; do sleep 15; done
これにより、jobisrunningコマンドが実行されます。trueが返された場合、シェルは15秒間スリープしてから、再テストします。次の例は、ファイルが表示されてから消えるのを待つことを示しています。
while [ ! -f abc ]; do sleep 3; echo no abc; done
while ls abc >/dev/null 2>&1; do sleep 3; echo an abc; done
2行目のテストは[ -f abc ]
代わりになります。/ dev / nullにルーティングすることにより、出力メッセージとエラーメッセージを抑制する方法を説明するために、より長い例を示しました。while
(4)ステートメントのテストの意味を逆にするには、単語while
を。に置き換えuntil
ます。たとえば、while [ ! -f abc ]; ...
はと同等until [ -f abc ]; ...
です。