如何配置Slurm在作业超时终止或运行失败时执行指定操作?
Slurm作业异常/超时终止时自动执行自定义操作配置方法
你可以根据自己是普通作业用户还是集群管理员,选对应的配置方式,不需要额外安装第三方工具,Slurm原生就支持这类触发逻辑。
普通用户单作业配置(无管理员权限可用)
最稳妥的方式是用Slurm原生的用户级epilog参数,这个参数指定的命令会在作业退出(不管是正常跑完、超时被终止、运行报错崩溃)后、计算节点释放资源前自动执行,普通用户直接就能用。
- 如果你不需要区分作业退出原因,不管啥情况结束都执行
touch stopped.txt,直接在提交作业的sbatch脚本头部加配置就行:
#!/bin/bash #SBATCH --job-name=your_job #SBATCH --time=01:00:00 # 注意写绝对路径,避免因为工作目录不对找不到文件 #SBATCH --epilog="touch /home/your_username/stopped.txt" # 下面写你自己的作业运行命令 python train.py
也可以在命令行提交的时候直接加参数:sbatch --epilog="touch /home/your_username/stopped.txt" your_script.sh
- 如果你只想在作业超时、运行失败的时候执行操作,正常跑完不触发,就把自定义逻辑写到单独的脚本里,比如新建
job_cleanup.sh:
#!/bin/bash # Slurm会自动注入作业相关环境变量,直接判断状态即可 if [[ "$SLURM_JOB_STATE" == "FAILED" || "$SLURM_JOB_STATE" == "TIMEOUT" ]]; then touch /home/your_username/stopped.txt # 其他需要执行的操作,比如发通知、删临时文件都可以加在这里 fi
给脚本加执行权限:chmod +x job_cleanup.sh,然后把epilog参数指向这个脚本的绝对路径就行:#SBATCH --epilog="/home/your_username/job_cleanup.sh"
如果你需要在作业刚收到终止信号、还没被强制杀死的时候执行操作(比如保存训练中间checkpoint),可以在作业脚本里用trap捕获信号做兜底,注意这种方式遇到SIGKILL强杀、节点宕机的情况不会触发,还是要搭配epilog用:
#!/bin/bash # 捕获终止信号、脚本退出事件 trap 'touch /home/your_username/stopped.txt' SIGTERM SIGINT EXIT # 你的作业命令 python train.py
集群全局配置(需要管理员权限)
如果要给集群所有作业都统一配置终止触发逻辑,修改Slurm控制节点的slurm.conf配置文件,添加全局Epilog路径:
Epilog=/usr/local/sbin/slurm_global_epilog.sh
在这个指定的脚本里写需要全局执行的自定义操作即可,全局epilog默认以root权限在计算节点执行,不要写高危操作。改完执行scontrol reconfigure重新加载配置就生效。
注意事项
- epilog里不要写耗时超过10秒的操作,否则会阻塞计算节点的资源回收,影响后续作业调度。
- 如果用Singularity/Docker跑作业,epilog默认在宿主机环境执行,要操作容器内文件需要提前做好目录挂载,写宿主机上的映射路径。
- 所有路径尽量用绝对路径,避免因为作业工作目录变化导致命令执行失败。
内容的提问来源于stack exchange,提问作者Jonatan Öström
相关产品推荐
相关产品推荐

