如何编写脚本批量提交不同子目录中的Slurm作业?
自动批量提交Slurm作业脚本(支持分批/范围指定)
完整脚本
#!/bin/bash # 参数检查:至少需要输入文件基名 if [ $# -lt 1 ]; then echo "用法:$0 <输入文件基名> [目录范围,如001-020] [每批数量,默认20] [延迟秒数,默认30]" echo "示例:" echo " 提交所有Dxxx目录:$0 tma.h2s-2-vpt2-b97m-d4-qz" echo " 提交D001到D020:$0 tma.h2s-2-vpt2-b97m-d4-qz 001-020" echo " 每批提交15个,间隔20秒:$0 tma.h2s-2-vpt2-b97m-d4-qz 001-084 15 20" exit 1 fi BASE_NAME=$1 DIR_RANGE=${2:-"001-999"} # 默认覆盖001到999的目录 BATCH_SIZE=${3:-20} DELAY=${4:-30} # 解析目录范围,处理前导零 IFS='-' read -r START END <<< "$DIR_RANGE" START=$(printf "%03d" "$START") END=$(printf "%03d" "$END") WORK_DIR=$(pwd) SUBMIT_COUNT=0 # 遍历指定范围的目录 for (( N=$(echo "$START" | sed 's/^0*//'); N<=$(echo "$END" | sed 's/^0*//'); N++ )); do DIR_NAME=$(printf "D%03d" "$N") # 跳过不存在的目录 if [ ! -d "$DIR_NAME" ]; then echo "警告:目录 $DIR_NAME 不存在,跳过" continue fi cd "$DIR_NAME" # 检查是否有.inp输入文件 INP_FILE=$(ls *.inp 2>/dev/null) if [ -z "$INP_FILE" ]; then echo "警告:目录 $DIR_NAME 无.inp文件,跳过" cd "$WORK_DIR" continue fi # 生成与手动提交一致的作业名 JOB_NAME="${BASE_NAME}_${DIR_NAME}" # 提交作业 sbatch -J "$JOB_NAME" slurm-run-orca.job if [ $? -eq 0 ]; then echo "已提交作业:$JOB_NAME" SUBMIT_COUNT=$((SUBMIT_COUNT + 1)) # 每提交BATCH_SIZE个任务后延迟,避免集群拥堵 if [ $((SUBMIT_COUNT % BATCH_SIZE)) -eq 0 ] && [ $SUBMIT_COUNT -ne 0 ]; then echo "已提交$SUBMIT_COUNT个任务,等待$DELAY秒..." sleep "$DELAY" fi else echo "提交失败:$JOB_NAME" fi cd "$WORK_DIR" done echo "批量提交完成,共成功提交$SUBMIT_COUNT个任务"
脚本说明
核心功能
- 自动遍历指定范围的
Dxxx目录,提交Slurm作业 - 支持分批提交:每提交指定数量的任务后自动延迟,避免集群队列拥堵
- 兼容带前导零的目录命名(如
D001、D010) - 错误处理:跳过不存在的目录或无输入文件的目录
修复原脚本的问题
- 修正
work_dir="pwd"的错误:改用$(pwd)获取当前工作目录的实际路径 - 替换错误的
while循环逻辑:用for循环遍历数字范围,自动补前导零生成目录名 - 替换错误的
squeue命令:改用sbatch提交作业 - 增加参数验证和错误提示,提升脚本健壮性
使用方法
- 将脚本保存为
job-submission.sh,赋予执行权限:
chmod +x job-submission.sh
- 根据需求运行脚本:
- 提交所有存在的Dxxx目录:
./job-submission.sh tma.h2s-2-vpt2-b97m-d4-qz - 提交指定范围的目录(如D001到D020):
./job-submission.sh tma.h2s-2-vpt2-b97m-d4-qz 001-020 - 自定义分批规则(每批15个任务,间隔20秒):
./job-submission.sh tma.h2s-2-vpt2-b97m-d4-qz 001-084 15 20
内容的提问来源于stack exchange,提问作者isolated matrix
相关产品推荐
相关产品推荐

