我正在使用SLURM的计算机上运行仿真。我可以设置的最长挂墙时间为24小时,但是我的模拟过程将花费更长的时间(大约1周左右)。我知道,原则上,我可以保留一项工作,只需通过运行sbatch --dependency=afterok:xxxxxxxx batch_file
就可以在上一个模拟结束后重新启动模拟。我的问题是,如果我的模拟由于墙壁时间而终止,则afterok
依赖项将向我返回DependencyNeverSatisfied
错误,并且SLURM文档中明确说明了发生这种情况的原因:
afterok:job_id[:jobid...]
该作业可以在指定的作业成功执行后(以退出代码为零运行完成)开始执行。
如果机器因为模拟时间超过墙壁时间而杀死了我的工作,则该工作不会以退出代码为零结束(至少到目前为止,这是我的经验)。不幸的是,我无法有效地设置仿真时间,因此无法在24小时内完全结束仿真。所以这是我的问题。有没有一种方法可以告诉SLURM“仅在您依赖的作业xxx
仅因为其执行时间超过了挂起时间而被杀死后才开始作业yyy
”?如果您明白我的意思,类似afterwalltime
的标志。我想指定afterany
不是一个选项,因为它可能导致潜在的危险行为(即使发生某些错误并破坏了输出文件,模拟也可能尝试重新启动)。
答案 0 :(得分:2)
其中一个选项是afternok
/ afterany
选项,但是由于其他因工作原因引起的问题,您已经将其丢弃。但是您可以在脚本的开头添加一个检查,以查看文件是否正常,仅在这种情况下,继续。
应对这种情况的最常见方法是准备并运行您希望持续23h的模拟,要求24小时的挂墙时间,并根据需要启动任意数量的工作(由afterok
依赖项链接) )以获得最终结果。