-1

以下に概説する手順を実行するためのスクリプトを作成したいと思います。誰かがスクリプトを使用してファイルを変更し、フォルダーを検索する方法の簡単な例を提供できれば(必ずしも以下の私の問題を解決するとは限りません)、私はそれを大いに感謝します。

  1. キューMyJobcurrentDirectory使用してジョブを送信するmyJobShellFile.sh

  2. が完了するとMyJob、に移動しcurrentDirectory/myJobDataFolderます。にはmyJobDataFolder、フォルダがあります

    myJobData.0000 myJobData.0001 myJobData.0002 myJobData.0003

    maxIterationリストされているすべてのフォルダーの最大数を見つけたい。ここではmaxIteration=0003。\

  3. ファイルmyJobShellFile.shでは、最後の行に

    mpiexec ./main inputmyJobDataFolder

    この行をに追加したい

    'mpiexec ./main input myJobDataFolder 0003'

  4. MyJob質問に提出したいwhile maxIteration < 10

  5. が完了しMyJobたら、新しい番号を見つけてmaxIterationこの番号を変更しmyJobShellFile.sh、手順4に進みます。

人々は通常、このようなことを行うためにPythonスクリプトを作成すると思いますが、その方法を見つけるのに苦労しています。私はおそらくこの手順の正しい用語を知りません。また、キューイングシステムによってスクリプトが若干異なることも承知しておりますが、ご協力いただければ幸いです。

4

1 に答える 1

1

「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
mpiexect=$((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 ]; ...です。

于 2012-11-29T22:38:52.020 に答える