나는 수백 개의 작업에 대한 입력 파일을 준비하는 파이썬 스크립트를 작성하고 있습니다 (job.id = 1에서 job.id = 1로 job.id 자체 할당 된 ID입니다) 실행을 위해 클러스터에 제출하십시오. 각 작업에는 s1, s2 및 s3의 3 단계가 있습니다. 여기서 s2는 s1의 결과에 종속되고 s3은 s2의 결과에 종속됩니다. 각 작업은 수퍼 클러스터에서 48-64 CPU 코어를 사용하여 3-4 일이 소요될 수 있습니다. 스크립트가 각 작업의 모든 단계를 자동으로 처리하기를 원합니다. 한 가지 방법은 모든 작업에 대해 s1 단계를 한 번에 제출 한 다음 모든 작업에 대한 출력 파일 (있는 경우) 또는 큐 상태를 정기적으로 확인하고 특정 작업이 대기열에서 사라 졌는지 확인하는 것입니다 (예 : 완료, 각 5 또는 10 또는 12 시간 후). 스크립트의 기본 레이아웃은 다음과 같습니다.Python 스크립트에서 PBS/Torque/Slurm 작업 완료 상태를 얻는 방법
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로 다음 단계로 갈 수 있습니다. 작업 나머지 부분의 상태 확인). 아니면 누군가가 더 나은 해결책을 제안 할 수 있습니까?