在SLURM sbatch脚本中使用Bash变量



我试图从另一个文件中获取一个值,并在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.

有人能帮忙吗?

这行不通。当您运行

时会发生什么?

sbatch myscript.sh

是slurm为那些特殊的#SBATCH行解析脚本,生成作业记录,将批处理脚本存储在某个地方。批处理脚本只在作业运行时执行。

因此,您需要以稍微不同的方式构建您的工作流,并在提交作业之前首先计算所需的进程数。注意,您可以使用像

这样的内容

sbatch -n $numProcs myscript.sh

,您不需要自动生成脚本(此外,mpirun应该能够自动获得分配中的进程数,无需使用"-np")。

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

如果与OP一样,您的sbatch选项依赖于您在其上面放置的命令,请参阅另一个解决方案。

批处理脚本可能包含以"#SBATCH"脚本中的任何可执行命令。Sbatch将停止处理进一步#SBATCH指令一旦第一个非注释非空格已到达脚本中的行。

从sbatch文档,我的重点。

最新更新