在SLURM的sbatch脚本中使用Bash变量

20

我正在尝试从另一个文件中获取一个值,并在SLURM提交脚本中使用它。然而,我遇到了一个错误,提示该值不是数值类型,换句话说,该值没有被引用。

这是脚本:

#!/bin/bash
# This reads out the number of procs based on the decomposeParDict                                                                                          
numProcs=`awk '/numberOfSubdomains/ {print $2}' ./meshModel/decomposeParDict`
echo "NumProcs = $numProcs"

#SBATCH --job-name=SnappyHexMesh                                                                                                                            
#SBATCH --output=./logs/SnappyHexMesh.log                                                                                                                   
#                                                                                                                                                           
#SBATCH --ntasks=`$numProcs`                                                                                                                                
#SBATCH --time=240:00                                                                                                                                       
#SBATCH --mem-per-cpu=4000                                                                                                                                  

#First run blockMesh                                                                                                                                        
blockMesh

#Now decompose the mesh                                                                                                                                     
decomposePar

#Now run snappy in parallel                                                                                                                                 
mpirun -np $numProcs snappyHexMesh -parallel -overwrite

当我将此脚本作为普通的Bash shell脚本运行时,它会正确地打印出进程数,并进行正确的 mpirun 调用。因此,awk 命令正确解析出进程数,变量也按预期进行了引用。

但是,当我使用以下方式将其提交到SLURM:

sbatch myScript.sh

我遇到了以下错误:

sbatch: error: Invalid numeric value "`$numProcs`" for number of tasks.

有人可以帮忙吗?


在脚本中不要使用反引号,而应该使用另一个,比如 $(...) - Avinash Raj
2个回答

12

这样做是不行的。当你运行

sbatch myscript.sh

时,slurm会解析该脚本中的特殊 #SBATCH 行,生成一个作业记录,并将批处理脚本存储在某个地方。批处理脚本仅在作业运行时才执行。

因此,在提交作业之前,您需要以稍微不同的方式组织您的工作流程,并首先计算您需要的处理器数量。请注意,您可以使用类似以下命令:

sbatch -n $numProcs myscript.sh

您不需要自动生成脚本(mpirun也应该能够自动获取您分配的处理器数量,无需使用“-np”)。


是的,那就是解决方案。我使用一个“sub”脚本来提交我的作业脚本。谢谢@Janneb。 - Madeleine P. Vincent

3

Slurm在脚本中第一行可执行代码之前停止处理#SBATCH指令。对于那些#SBATCH指令不依赖于其上方代码的用户,只需将#SBATCH指令放在顶部。

如果像OP一样,您的sbatch选项取决于您放置在它们上面的命令,请参见另一个答案以获取解决方法/解决方案。

批处理脚本可以包含在脚本中的可执行命令之前带有“#SBATCH”的选项。一旦到达脚本中的第一行非注释非空白行,sbatch将停止处理进一步的#SBAT指令。

来自sbatch文档,我强调。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接