SLURMを介してバッチサーバーに送信する次の単純なbashスクリプトがあるとします。
#!/bin/bash
#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"
hostname
exit 0
このスクリプトでは、次のようにコマンドラインでフルネームを制御するテキストファイルにhostname
の出力を書き込むだけです。
login-2:jobs$ sbatch -D `pwd` exampleJob.sh 1
Submitted batch job 203775
残念ながら、作成されたファイルには探しているサフィックスがなく、文字列「$ 1」は文字通りに解釈されるため、私の最後のコマンドライン引数(1)はsbatchを通じて解析されないようです:
login-2:jobs$ ls
errFile$1.txt exampleJob.sh outFile$1.txt
[〜#〜] so [〜#〜] および elsewhere の場所を調べましたが、運がありませんでした。本質的に私が探しているのは、-v
Torque対応クラスターのqsub
ユーティリティの切り替え。
Edit:基になるコメントスレッドで述べたように、私は問題を解決しました。1つのスクリプトを複数回送信する代わりに、それぞれ異なるコマンドライン引数を持つバッチサーバーで、同じコンテンツを異なるスクリプトにエコーしてリダイレクトする「マスタースクリプト」を作成しました。各コンテンツは、渡されるコマンドラインパラメーターによって変更されます。次に、sbatch
を介してすべてをバッチサーバーに送信しました。ただし、これは元の質問に答えないため、質問への回答として追加するか、この質問を解決済みとしてマークすることをためらいます。
#SBATCHで始まる行はbashによって解釈されませんが、sbatchによってコードに置き換えられます。 sbatchオプションは$ 1変数をサポートしていません(%jと他の一部のみ、$ 1を%1に置き換えると機能しません)。異なるsbatchプロセスが並行して実行されていない場合は、試すことができます
#!/bin/bash
touch outFile${1}.txt errFile${1}.txt
rm link_out.sbatch link_err.sbatch 2>/dev/null # remove links from previous runs
ln -s outFile${1}.txt link_out.sbatch
ln -s errFile${1}.txt link_err.sbatch
#SBATCH -o link_out.sbatch
#SBATCH -e link_err.sbatch
hostname
# I do not know about the background processing of sbatch, are the jobs still running
# at this point? When they are, you can not delete the temporary symlinks yet.
exit 0
別の方法:自分でコメントで言ったように、マスタースクリプトを作成できます。このスクリプトには次のような行を含めることができます
cat exampleJob.sh.template | sed -e 's/File.txt/File'$1'.txt/' > exampleJob.sh
# I do not know, is the following needed with sbatch?
chmod +x exampleJob.sh
テンプレートでは、#SBATCH行は次のようになります
#SBATCH -o "outFile.txt"
#SBATCH -e "errFile.txt"
コマンドラインを介してコマンドを渡す場合、バッチスクリプトでコマンドライン引数を渡すことができないという問題を実際に回避できます。したがって、たとえば、コマンドラインで:
var1="my_error_file.txt"
var2="my_output_file.txt"
sbatch --error=$var1 --output=$var2 batch_script.sh
ラッパーを使用すると便利です。 this thread からこの解決策を見つけました。
基本的に問題は、SBATCHディレクティブがシェルによってコメントとして認識されるため、渡された引数を使用できないことです。代わりに、ヒアドキュメントを使用して、引数が適切に設定された後にbashスクリプトをフィードできます。
ご質問の場合は、シェルスクリプトファイルを次のように置き換えることができます。
#!/bin/bash
sbatch <<EOT
#!/bin/bash
#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"
hostname
exit 0
EOT
そして、次のようにシェルスクリプトを実行します。
bash [script_name].sh [suffix]
そして、出力はoutFile [suffix] .txtおよびerrFile [suffix] .txtに保存されます
このような何かが私とトルクのために働く
echo "$(pwd)/slurm.qsub 1" | qsub -S /bin/bash -N Slurm-TEST
slurm.qsub:
#!/bin/bash
hostname > outFile${1}.txt 2>errFile${1}.txt
exit 0