You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:12:24