如何在Python脚本中获取PBS/Torque/Slurm作业完成状态

2024-05-17 04:34:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python脚本,它为数百个作业准备输入文件(例如作业.id=1至作业.id=1000,其中作业.id是一个自分配的id),然后在集群上提交它们以供执行。每个作业有3个阶段,s1、s2和s3,其中s2依赖于s1的结果,s3依赖于s2的结果。在超级集群上使用48-64个cpu核心,每个作业可能需要3到4天的时间。我希望我的脚本自动处理每个作业的所有阶段。我认为一种方法是一次性提交所有作业的s1阶段,然后每隔5、10或12小时定期检查所有作业的输出文件(如果存在)的状态,或者读取队列状态,并查看某个特定作业是否从队列中消失(即完成)。我的脚本的基本布局如下所示。在

import sched, time
from subprocess import *

jobs_running = True
s = sched.scheduler(time.time, time.sleep)

def Prepare():
    print "prepare jobs by reading some source files"
    print "set some flages for each job, e.g. job.id, job.stage, etc."
    print "submit jobs using < Popen('qsub nNodes Ncores jobinputfile') > "

def JobStatus():
    global jobs_running
    print "check status of each job"
    """
    for job in jobs:
        if job.stage1 == complete:
           print "goto stage 2"
           print "reset job.stage flages etc."
         elif job.stage2 == complete:
           print " go to stage 3"
           .
           .
         else last stage:

    if all stages complete for all jobs:
       set (global var) jobs_running = False
    """

def SecondStage():
    print " prepare for second stage "
    print " submit using < Popen('qsub nNodes Ncores jobinputfile') > "

def TimeSchedular(sc): 
    global jobs_running
    JobStatus()
    if jobs_running :
        s.enter(36000, 1, TimeSchedular, (sc,))

if (__name__ == "__main__"):    
    Prepare()
    s.enter(36000, 1, TimeSchedular, (s,))
    s.run()

出于许多原因,这绝对不是一个优雅的解决方案。例如,我必须检查每个周期中每个作业的状态。另外,如果一个作业在检查状态后立即完成,它将等待5、10或12个小时,以便提交到下一个阶段。所以我的问题是:

有没有办法直接从PBS/SLURM或上述布局中的系统获取作业完成信号作业.id=99,以便进入下一阶段(不检查其余作业的状态)? 或者有人能提出更好的解决方案吗?在


Tags: 脚本idforiftime状态def作业
1条回答
网友
1楼 · 发布于 2024-05-17 04:34:37

通常的方法是通过作业dependencies。例如,如果某个作业在启动前依赖于另一个作业,则可以执行以下操作:

jobid1=`qsub phase_one.sh`
jobid2=`qsub phase_two.sh -W depend=afterok:${jobid1}`
# and so on as needed

链接到扭矩文档。我相当确定大多数资源管理器都提供类似的功能。在

相关问题 更多 >