Slurm任务调度:如何配置task3在task1和task2完成后启动
Slurm任务依赖配置:让task3等待task1和task2完成后启动
我需要配置Slurm任务依赖,让task3仅在task1和task2均成功完成后再启动。目前采用的链式调度(task1完成后启动task2,task2完成后启动task3)效率较低,想改成task1和task2并行执行,task3等两者都完成再启动。
当前链式调度脚本
task1=$(sbatch --parsable --job-name="${JobID1}" ${Dir}/something.sh) sleep 2 echo ${task1} task1=${task1} task2=$(sbatch --parsable --dependency=aftercorr:$task1 --job-name="${JobID2}" ${Dir}/somethingelse.sh) sleep 2 echo ${task2} task2=${task2} task3=$(sbatch --parsable --dependency=aftercorr:$task2 --job-name="${JobID3}" ${Dir}/somethingelse.sh) sleep 2 echo ${task3} task3=${task3}
尝试的并行依赖配置
我尝试了以下代码,但不确定语法是否正确:
task3=$(sbatch --parsable --dependency=aftercorr:$task1,$task2 --job-name="${JobID3}" ${Dir}/somethingelse.sh) sleep 2 echo ${task3} task3=${task3}
语法正确性说明
你尝试的代码完全正确。Slurm的aftercorr依赖支持用逗号分隔多个任务ID,表示所有指定的前置任务都必须成功完成(即退出码为0),才会启动当前任务。
另外可以优化脚本里的冗余部分:
sleep 2完全没必要,--parsable参数会立即返回任务ID,不需要等待task1=${task1}这种重复赋值属于无效代码,可以直接删除
优化后的完整脚本示例:
# 提交task1和task2并行执行 task1=$(sbatch --parsable --job-name="${JobID1}" ${Dir}/something.sh) task2=$(sbatch --parsable --job-name="${JobID2}" ${Dir}/somethingelse.sh) # 提交task3,等待task1和task2都成功完成 task3=$(sbatch --parsable --dependency=aftercorr:$task1,$task2 --job-name="${JobID3}" ${Dir}/somethingelse.sh) # 可选:输出任务ID echo "Task1 ID: $task1" echo "Task2 ID: $task2" echo "Task3 ID: $task3"
如果需要task3在task1和task2无论成功失败都启动,只需把aftercorr换成afterany即可。
内容的提问来源于stack exchange,提问作者Krutik
相关产品推荐
相关产品推荐

