依赖作业提交脚本

大约 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}')

注意:

  1. 注释三行代码表示: jobC 要等待 jobA 和 jobB 都成功完成才能运行

  2. 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}"

提示

  1. 定义一个名为 job_ids 的数组, 存储多个作业的ID

  2. 循环遍历这个数组, 在循环中构建依赖关系列表

  3. 脚本输出为:

    依赖关系列表为: afterok:1234:afterok:5678:afterok:9012

上次编辑于:
贡献者: jiyunqq