web-dev-qa-db-ja.com

sbatchを介してコマンドライン引数を渡す

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を介してすべてをバッチサーバーに送信しました。ただし、これは元の質問に答えないため、質問への回答として追加するか、この質問を解決済みとしてマークすることをためらいます。

22
Jason

#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"
3
Walter A

コマンドラインを介してコマンドを渡す場合、バッチスクリプトでコマンドライン引数を渡すことができないという問題を実際に回避できます。したがって、たとえば、コマンドラインで:

var1="my_error_file.txt"
var2="my_output_file.txt"
sbatch --error=$var1 --output=$var2 batch_script.sh
13

ラッパーを使用すると便利です。 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に保存されます

2
PouyaB

このような何かが私とトルクのために働く

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
1
user3665696