如何让bash脚本等待sbatch作业完成后再执行后续流程
bash中等待sbatch作业完成的解决方案
方案1:直接使用sbatch内置--wait参数(最推荐)
这是最简单的实现方式,sbatch的--wait参数会让命令本身进入阻塞状态,直到提交的作业完全运行结束后才会返回,命令的退出码和作业的最终退出码保持一致。
你只需要修改你的提交命令即可:
export SOME_STUFF #define paths #run the model w/ 加上--wait参数 sbatch --wait ./job_card # 作业运行结束后才会执行后续命令 mv your_output target_path
你还可以增加作业执行结果的判断,避免后续流程处理异常的输出:
if ! sbatch --wait ./job_card; then echo "模型作业运行失败,终止后续流程" exit 1 fi
方案2:捕获作业ID轮询状态(适配不支持--wait的场景)
部分旧版本的Slurm集群或者特殊配置下无法使用--wait参数,你可以先捕获提交作业的ID,通过循环查询作业状态实现等待:
export SOME_STUFF #define paths # --parsable参数会让sbatch仅输出作业ID,方便捕获 JOB_ID=$(sbatch --parsable ./job_card) # 每隔30秒查询一次作业是否还在排队/运行中,作业结束后squeue查不到对应ID就退出循环 while squeue -j "${JOB_ID}" > /dev/null 2>&1; do sleep 30 done # 后续依赖作业输出的命令 mv your_output target_path
如果需要判断作业最终是否运行成功,可以在循环结束后用sacct查询作业状态:
JOB_STATE=$(sacct -j "${JOB_ID}" --format=State --noheader | xargs) if [ "${JOB_STATE}" != "COMPLETED" ]; then echo "作业运行异常,最终状态为${JOB_STATE}" exit 1 fi
内容的提问来源于stack exchange,提问作者aeolean
相关产品推荐
相关产品推荐

