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

时间:2017-01-11 09:31:23

标签: python job-scheduling pbs

我正在编写一个python脚本,为数百个作业准备输入文件(比如job.id = 1到job.id = 1000,其中job.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或上述布局中的系统获取作业完成信号,比如job.id = 99,这样就可以进入下一阶段(不检查状态其余的工作)? 或者有人可以提出更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

实现这一目标的正常方法是通过工作dependencies。例如,如果您的工作在开始之前依赖于另一个工作,您可以执行以下操作:

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

那里的链接转到Torque文档。我很确定大多数资源管理器都提供类似的功能。