Slurm

在 .sh 腳本中將參數傳遞給註釋

  • September 21, 2021

我是使用 .sh 腳本的初學者,所以請原諒我的無知。這是我的問題:

要將我的作業送出到我們的集群,相應的送出文件必須包含一個“slurm header”,並且看起來像這樣。

#!/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

請注意,我將兩個參數傳遞給這個 .sh 文件,然後將它們傳遞給 matlab 程序。如何根據輸入參數使 Slurm 標頭中的作業名稱動態化?

簡單地按預期寫作#SBATCH --job-name=blabla$1$2是行不通的。

我不認為你可以。所有以開頭的行都#被 shell 忽略,$1and$2是 shell 的東西。許多作業管理器,包括 slurm,都有一些寫為 shell 註釋的命令,因此被 shell 忽略,但由作業管理器讀取。這就是你的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

如果您現在使用兩個參數執行此腳本,它將列印出您真正想要的腳本:

$ 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

引用自:https://unix.stackexchange.com/questions/669424