我正在尝试从另一个文件中获取值,并在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脚本运行时,它会正确打印出proc的数量并进行正确的mpirun
调用。因此awk
命令正确地解析了proc的数量,并且按预期取消引用变量。
但是,当我使用以下内容将其提交给SLURM时
sbatch myScript.sh
我收到错误:
sbatch: error: Invalid numeric value "`$numProcs`" for number of tasks.
任何人都可以帮忙吗?
答案 0 :(得分:9)
这不起作用。运行时会发生什么
sbatch myscript.sh
是slurm为那些特殊的#SBATCH行解析脚本,生成一个作业记录,将批处理脚本存储在某个地方。批处理脚本仅在作业运行时执行。
因此,您需要以稍微不同的方式构建工作流程,并在提交作业之前首先计算所需的过程数量。请注意,您可以使用类似
的内容 sbatch -n $numProcs myscript.sh
,你不需要自动生成脚本(同样,mpirun应该能够自动获取你的分配中的proc数量,不需要使用“-np”)。
答案 1 :(得分:0)
Slurm 停止处理脚本中第一行可执行代码的 #SBATCH
指令。对于 #SBATCH
指令不依赖于他们尝试在这些指令之上运行的代码的用户,只需将 #SBATCH
行放在顶部。
如果与 OP 一样,您的 sbatch 选项取决于您放置在它们上方的命令,请参阅其他答案以获取解决方法/解决方案。
<块引用>批处理脚本可能包含以“#SBATCH”开头的选项之前 脚本中的任何可执行命令。 sbatch 将停止处理 进一步#SBATCH 指令一旦第一个非注释非空白 已到达脚本中的行。
来自sbatch docs,我的重点。