私は.shスクリプトを使用する初心者ですので、無知を許してください。私の質問は次のとおりです。
自分のジョブをクラスタに送信するには、その送信ファイルに次の「slurmヘッダー」が含まれている必要があります。
#!/bin/sh
#
########## Begin Slurm header ##########
#
#SBATCH --job-name=blabla
#
########### End Slurm header ##########
# Load module
module load math/matlab/R2020a
# Start a Matlab program
matlab -nodesktop -r "program $1 $2"
exit
2つのパラメータを.shファイルに渡し、それをmatlabプログラムに渡します。入力パラメータに基づいてSlurmヘッダーのジョブ名を動的にする方法は?
単に#SBATCH --job-name=blabla$1$2
予測可能なコンテンツを作成することは効果がありません。
答え1
ジョブで実行したいコマンドのみを含む、以下のsbatchジョブスクリプトを作成します。
#!/bin/sh
# you can include #SBATCH comments here if you like, but any that are
# specified on the command line or in SBATCH_* environment variables
# will override whatever is defined in the comments. You **can't**
# use positional parameters like $1 or $2 in a comment - they won't
# do anything.
# Load module
module load math/matlab/R2020a
# Start a Matlab program
# give it five arguments, -nodesktop, -r, program, and two
# more that you pass in as arguments to THIS script.
matlab -nodesktop -r "program" "$1" "$2"
# alternatively (since I don't know how matlab runs "program",
# or how it handles args or how it passes them on to a matlab
# script), maybe just three args:
# matlab -nodesktop -r "program $1 $2"
exit
たとえば、必要に応じて保存./mymatlabjob.sh
して実行可能にします。chmod +x mymatlabjob.sh
次に、コマンドラインから実行します。
sbatch --job-name "whatever job name you want" ./mymatlabjob.sh arg1 arg2
matlabジョブに渡すパラメータはどこにありarg1
、何ですか?arg2
または、次のネストされたループで:
#!/bin/sh
for i in 1 2 3; do
for j in 3 2 1; do
sbatch --job-name "blablah$i$j" ./mymatlabjob.sh "$i" "$j"
done
done
このコマンドを実行すると、sbatchを使用してそれぞれ異なるジョブ名を持つ9つの異なるジョブが実行されます($ iおよび$ jの各反復ごとに1つ)。
答え2
私の考えでは、あなたはできないと思います。で始まるすべての行は#
シェルでは無視され、シェルの内容$1
です。$2
多くのタスクマネージャ(slurmを含む)では、一部のコマンドがシェルコメントで書かれているため、シェルでは無視されますが、タスクマネージャは読み込みます。これはあなたのSBATCH
ラインです:
#SBATCH --job-name=blabla
したがって、同じスクリプトでこれを動的に実行することは不可能です。ただし、これを行うためにラッパースクリプトを生成できます。たとえば、
#!/bin/sh
cat <<EoF
#!/bin/sh
#
########## Begin Slurm header ##########
#
#SBATCH --job-name=blabla$1$2
#
########### End Slurm header ##########
# Load module
module load math/matlab/R2020a
# Start a Matlab program
matlab -nodesktop -r "program $1 $2"
exit
EoF
2つのパラメータを使用してこのスクリプトを実行すると、目的のスクリプトが実際に印刷されます。
$ foo.sh param1 param2
#!/bin/sh
#
########## Begin Slurm header ##########
#
#SBATCH --job-name=blablaparam1param2
#
########### End Slurm header ##########
# Load module
module load math/matlab/R2020a
# Start a Matlab program
matlab -nodesktop -r "program param1 param2"
exit
だからあなたはこれを行うことができます:
foo.sh param1 param2 > slurm_script.sh