def child_timed_out(child): global children child_write_out(child,"Timed out.") child.process.terminate(); child.task.end_time = datetime.now() child.status = scheduledb.ERROR_TIMEOUT scheduledb.update_task_mult(child.task,[ ['end_time',child.end_time], ['status',child.status] ]) if ( child.fout != stdout ): child.fout.close() children.remove(child)
def child_died(child, retval): global children child.task.end_time = datetime.now() if ( retval != 0 ): # assume error child.task.status = scheduledb.ERROR_CRASH else: child.task.status = scheduledb.DONE scheduledb.update_task_mult(child.task,[ ['end_time',child.task.end_time], ['status',child.task.status] ]) if ( child.fout != sys.stdout ): child.fout.close() children.remove(child)
def child_kill(child): global children if child.status != scheduledb.RUNNING: print "Can't kill task %d because it isn't running"%(child.task.id) child_write_out(child,"Killed.") child.process.terminate(); child.task.end_time = datetime.now() child.status = scheduledb.STOPPED scheduledb.update_task_mult(child.task,[ ['end_time',child.task.end_time], ['status',child.status] ]) if ( child.fout != stdout ): child.fout.close() children.remove(child)
def child_write_out(child, msg): msg = msg.rstrip(); m = statexpr.match(msg) if m : child.task.progress_steps_done = m.group('stepd') child.task.progress_steps_total= m.group('stept') child.task.step_description = m.group('stepn') child.task.step_progress_str = m.group('prog') scheduledb.update_task_mult(child.task,[ ['progress_steps_done', child.task.progress_steps_done], ['progress_steps_total', child.task.progress_steps_total], ['step_description', child.task.step_description], ['step_progress_str',child.task.step_progress_str] ]) lines = msg.split('\n') for line in lines: print >> child.fout,line
child = ChildProcess() children.append(child) child.task = task; try: child.fout = open(child.task.log_file,'a',0) except IOError,msg: child.fout = sys.stdout child_write_out(child,"Couldn't open log file for writing: "+str(msg)) try: child.process = asyncprocess.Popen(shlex.split(task.command), stdin=asyncprocess.PIPE, stderr=asyncprocess.PIPE, stdout=asyncprocess.PIPE, bufsize=1, universal_newlines=True); child.task.pid = child.process.pid child.task.status = scheduledb.RUNNING child.start_time = datetime.now() scheduledb.update_task_mult(child.task,[['start_time',child.start_time], ['status',child.task.status], ['pid',child.task.pid] ]) except OSError,msg: child_write_out(child,"Couldn't start process: "+str(msg)) child.process = None; child_died(child,-1); def child_timed_out(child): global children child_write_out(child,"Timed out.") child.process.terminate(); child.task.end_time = datetime.now() child.status = scheduledb.ERROR_TIMEOUT scheduledb.update_task_mult(child.task,[ ['end_time',child.end_time], ['status',child.status]