如何防止Slurm在最后一个进程失败或被杀时终止整个作业?
Slurm作业终止机制解析
你的场景原因
先拆解你遇到的现象根源:
你的脚本python process1 & process2 & process3 & process4里,前3个进程是后台启动(加了&),第4个是前台进程。Slurm只盯着执行你脚本的那个主shell进程——只要这个主shell没退出,作业就会继续;主shell一退,Slurm直接终止整个作业,还会把所有属于这个作业的子进程(包括后台跑的那几个)都杀掉。
- 前3个进程被杀:主shell还在等前台的process4跑完,所以作业不会停,直到process4执行完毕,主shell才会退出,Slurm才结束作业。
- 第4个进程崩溃/被杀:前台进程直接退出,主shell没东西可等,立刻就退出,Slurm检测到主进程消失,直接终止整个作业,同时把还在运行的前3个进程也干掉。
Slurm作业终止的核心机制
- 主进程绑定逻辑:Slurm启动作业时,会先启动一个shell来执行你的脚本,这个shell就是Slurm唯一监控的「主进程」。不管你脚本里开多少子进程,只要主shell没退出,作业就处于运行状态;主shell一旦退出,Slurm立刻认定作业结束,清理所有关联的子进程。
- 成功/失败判定:Slurm根据主shell的退出码判定作业状态:
- 主shell退出码为0:作业标记为成功,哪怕后台进程之前崩溃过(默认shell不会因为后台进程退出而改变自己的退出码,除非你用
wait命令主动检查后台进程状态)。 - 主shell退出码非0:作业标记为失败,比如前台进程崩溃、脚本里有命令执行出错等情况。
- 主shell退出码为0:作业标记为成功,哪怕后台进程之前崩溃过(默认shell不会因为后台进程退出而改变自己的退出码,除非你用
- 主动终止作业:如果用
scancel命令手动终止作业,Slurm会先给主shell发终止信号,主shell退出后,所有子进程也会被同步清理。
内容的提问来源于stack exchange,提问作者Harsh
相关产品推荐
相关产品推荐

