如何处理中间作业动态生成时的SLURM作业依赖问题
解决SLURM动态生成作业的流水线依赖问题
要让job_3.sh仅在动态生成的job_2.sh执行完成后运行,有两种可行的方案,以下是具体实现:
方案一:动态更新job3的依赖关系
先提前提交处于挂起状态的job3,待job2提交后,修改job3的依赖规则。
修改pipeline.sh
#!/bin/bash # 提交job1,负责生成job2.sh job1_id=$(sbatch --parsable job_1.sh) # 先提交job3,用无效依赖(afterok:0)让它处于挂起状态 job3_id=$(sbatch --parsable --dependency=afterok:0 job_3.sh) echo $job3_id > job3_id.txt # 提交job1_5,传入job1的ID和job3的ID作为参数 job1_5_id=$(sbatch --parsable --dependency=afterok:$job1_id job_1_5.sh $job1_id $job3_id)
修改job_1_5.sh
#!/bin/bash #SBATCH --job-name=job1_5 #SBATCH --output=job1_5_%j.out #SBATCH --time=00:05:00 # 接收传入的参数:$1是job1的ID,$2是job3的ID job1_id=$1 job3_id=$2 # 提交job2并记录其ID job_2_id=$(sbatch --parsable job_2.sh) echo $job_2_id > job2_id.txt # 更新job3的依赖,改为等待job2执行成功后再运行 scontrol update jobid=$job3_id dependency=afterok:$job_2_id # 若需要同时等待job1_5完成,可改为: # scontrol update jobid=$job3_id dependency=afterok:$SLURM_JOB_ID,$job_2_id
方案二:让job1_5负责提交job3(推荐)
调整流水线逻辑,让中间作业job1_5在提交job2后,直接提交job3并指定依赖关系,无需提前提交job3。
修改pipeline.sh
#!/bin/bash # 提交job1,负责生成job2.sh job1_id=$(sbatch --parsable job_1.sh) # 提交job1_5,仅依赖job1执行成功 job1_5_id=$(sbatch --parsable --dependency=afterok:$job1_id job_1_5.sh)
修改job_1_5.sh
#!/bin/bash #SBATCH --job-name=job1_5 #SBATCH --output=job1_5_%j.out #SBATCH --time=00:05:00 # 提交job2并记录其ID job_2_id=$(sbatch --parsable job_2.sh) echo $job_2_id > job2_id.txt # 提交job3,指定依赖job2执行成功 job3_id=$(sbatch --parsable --dependency=afterok:$job_2_id job_3.sh) echo $job3_id > job3_id.txt
注意事项
- 方案二中无需提前提交
job3,逻辑更简洁,出错概率更低,优先推荐。 - 方案一中使用
scontrol update需要确保你有修改自身作业的权限(通常用户对自己提交的作业有此权限)。 - 移除
job_1_5.sh中原有的#SBATCH --dependency=afterok:$1行,避免与sbatch命令中的依赖规则冲突。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

