如何在SLURM的bash脚本中以变量形式指定作业数量
解决SBATCH数组任务外部传入作业数量的问题
核心问题原因
SLURM在解析脚本开头的#SBATCH指令时,还未启动bash执行脚本内容,因此脚本里的变量${n_jobs}无法被解析,导致--array参数失效。
方法一:提交时直接指定参数(最直接)
删掉脚本里的#SBATCH --array=1-${n_jobs}%5行,提交时通过命令行同时指定--array范围和脚本需要的n_jobs变量:
sbatch --array=1-30%5 --export=n_jobs=30 myscript.sbs
脚本内部的<misc commands>可以直接使用$n_jobs变量。
方法二:写一个简易提交包装脚本(避免重复输入)
如果不想每次手动计算--array范围,写个小脚本自动处理:
新建submit_job.sh:
#!/bin/bash # 检查输入参数 if [ $# -ne 1 ]; then echo "用法:./submit_job.sh <作业数量>" exit 1 fi n_jobs=$1 # 提交任务,自动生成array范围并传入n_jobs变量 sbatch --array=1-${n_jobs}%5 --export=n_jobs=${n_jobs} myscript.sbs
给脚本加执行权限:
chmod +x submit_job.sh
使用时直接运行:
./submit_job.sh 30
方法三:让脚本自动处理参数提交(无需额外脚本)
修改原myscript.sbs,让它检测是否传入n_jobs,如果没有就重新提交自己:
#!/bin/bash #SBATCH --job-name=test #SBATCH --output=test.log #SBATCH --mem=2G #SBATCH --partition=short #SBATCH --cpus-per-task=10 # 检查是否已传入n_jobs变量 if [ -z "$n_jobs" ]; then # 如果是直接提交脚本,检查命令行参数 if [ $# -eq 1 ]; then n_jobs=$1 # 重新提交自己,指定array范围和传入n_jobs sbatch --array=1-${n_jobs}%5 --export=n_jobs=${n_jobs} "$0" exit 0 else echo "错误:请指定作业数量,用法:sbatch $0 <n_jobs> 或 sbatch --export=n_jobs=<n_jobs> $0" exit 1 fi fi # 以下是原来的<misc commands> echo "当前作业ID: $SLURM_ARRAY_TASK_ID,总作业数: $n_jobs" # 其他任务命令...
使用时可以两种方式提交:
# 方式1:直接传参数给脚本 sbatch myscript.sbs 30 # 方式2:用--export传入变量 sbatch --export=n_jobs=30 myscript.sbs
内容的提问来源于stack exchange,提问作者garcesj
相关产品推荐
相关产品推荐

