Slurm提交依赖作业异常:后序合并结果作业始终无法运行求助
问题根源
你的依赖字符串格式错误,是slurmids变量拼接逻辑导致的:
- 初始化时
slurmids为空值,第一次循环拼接$slurmids:$(sbatch...)时,得到的结果是:<第一个作业ID>,后续拼接完的完整字符串开头会多一个多余的冒号。 - Slurm无法识别开头带冒号的依赖ID列表,会判定依赖格式无效,因此永远不会触发后续的合并作业。
修复方案
1. 修正ID拼接逻辑
把循环里的ID拼接部分改成如下逻辑,避免开头多余的冒号:
slurmids="" # storage of slurm job ids for k in $(seq 1 $nb_partitions) do cd results/partition$k/MainFolder # Write parameters to files within the main folder so they can be read into FORTRAN echo "$nb_partitions" >> nb_partitions.txt echo "$nb_threads" >> nb_threads.txt # 先获取当前提交的作业ID curr_id=$(sbatch --parsable --cpus-per-task=$nb_threads run.sh) # 拼接时判断是否为第一个ID,避免前缀多余冒号 if [ -z "$slurmids" ]; then slurmids="$curr_id" else slurmids="$slurmids:$curr_id" fi cd ../../.. done
2. 其他可选排查项
如果修改后问题仍然存在,可以检查以下两点:
- 确认循环中每个
sbatch提交都返回了合法的作业ID:可在循环中加一行echo $curr_id打印输出,排查是否有提交失败的报错信息混入了slurmids列表。 - 确认你的业务逻辑是否允许前置作业失败后仍执行合并:
afterok依赖要求所有前置作业的退出状态码为0,如果有任意一个作业运行失败、被手动取消,依赖都会永久无法满足,这种场景可以把依赖类型改成afterany。
内容的提问来源于stack exchange,提问作者Tim de Silva
相关产品推荐
相关产品推荐

