You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:10:34