依赖作业提交脚本
大约 2 分钟
作业需求
批量提交 jobA, jobB, jobC
jobB 要等待 jobA 成功完成才能运行
jobC 要等待 jobB 成功完成才能运行
#!/bin/bash
for i in {A,B,C}
do
echo "#!/bin/sh
#SBATCH --partition=gpu
#SBATCH --job-name=ok$i
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
echo "$i" > $i.out
sleep 30
" > job$i.sh
done
jobA_id=$(sbatch jobA.sh | awk '{print $NF}')
jobB_id=$(sbatch --dependency=afterok:${jobA_id} jobB.sh | awk '{print $NF}')
jobC_id=$(sbatch --dependency=afterok:${jobB_id} jobC.sh | awk '{print $NF}')
#jobA_id=$(sbatch jobA.sh | awk '{print $NF}')
#jobB_id=$(sbatch jobB.sh | awk '{print $NF}')
#jobC_id=$(sbatch --dependency=afterok:${jobB_id} --dependency=afterok:${jobA_id} jobC.sh | awk '{print $NF}')
注意:
注释三行代码表示: jobC 要等待 jobA 和 jobB 都成功完成才能运行
man sbatch 可以查看
--dependency
详细用法
1. 单个作业完成后才能运行
- afterok:<jobid>: 当指定的作业成功完成后,才能运行当前作业
- afternotok:<jobid>: 当指定的作业未成功完成时,才能运行当前作业
- afterany:<jobid>: 当指定的作业完成后,无论其状态如何,都可以运行当前作业
2. 多个作业完成后才能运行
- afterok:<jobid1>:<jobid2>: 当所有指定的作业都成功完成后,才能运行当前作业
- afternotok:<jobid1>:<jobid2>: 当所有指定的作业中有任何一个未成功完成时,才能运行当前作业
- afterany:<jobid1>:<jobid2>: 当所有指定的作业中的任何一个完成后,无论其状态如何,都可以运行当前作业
3. 复合依赖关系
可以混合使用上述参数和写法来创建更复杂的依赖关系例如: --dependency=afterok:<jobid1>:afternotok:<jobid2>
使用数组变量
将多个作业的依赖关系存储在数组变量中,可以通过循环构建依赖关系列表
#!/bin/bash
# 定义作业ID数组
job_ids=("1234" "5678" "9012")
# 定义空字符串来存储依赖关系列表
dependency=""
# 循环遍历作业ID数组
for job_id in "${job_ids[@]}"; do
# 如果不是第一个作业,则添加逗号作为分隔符
if [ -n "$dependency" ]; then
dependency="${dependency}:"
fi
# 构建依赖关系列表
dependency="${dependency}afterok:${job_id}"
done
# 输出构建的依赖关系列表
echo "依赖关系列表为: ${dependency}"
提示
定义一个名为 job_ids 的数组, 存储多个作业的ID
循环遍历这个数组, 在循环中构建依赖关系列表
脚本输出为:
依赖关系列表为: afterok:1234:afterok:5678:afterok:9012