我是使用 .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 忽略,$1
and$2
是 shell 的东西。许多作业管理器,包括 slurm,都有一些写为 shell 注释的命令,因此被 shell 忽略,但由作业管理器读取。这就是你的SBATCH
线:因此,无法在同一脚本中动态执行此操作。但是,您可以制作一个执行此操作的包装脚本。例如:
如果您现在使用两个参数运行此脚本,它将打印出您真正想要的脚本:
所以你可以这样做:
编写如下所示的 sbatch 作业脚本,仅包含您希望在作业中运行的命令:
将其保存为您喜欢的任何内容 - 例如
./mymatlabjob.sh
- 并使其可执行chmod +x mymatlabjob.sh
然后在命令行上像这样运行它:
where
arg1
和arg2
是您想要传递给 matlab 作业的参数。或者在这样的嵌套循环中:
运行它将使用 sbatch 运行 9 个不同的作业,每个作业都有不同的作业名称——$i 和 $j 的每次迭代都有一个。