.shスクリプトのコメントにパラメータを渡す

.shスクリプトのコメントにパラメータを渡す

私は.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

関連情報