我是使用 .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
可预测的内容是行不通的。
答案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
其中arg1
和arg2
是您想要传递给 matlab 作业的参数。
或者在像这样的嵌套循环中:
#!/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 的每次迭代都有一个作业名称。
答案2
我认为你不能。所有以 开头的行#
都会被 shell 忽略,并且$1
和$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