def _append_job_status_file(suite, task_job, event_time, messages): """Write messages to job status file.""" job_log_name = os.getenv('CYLC_TASK_LOG_ROOT') if not job_log_name: job_log_name = os.path.join( glbl_cfg().get_derived_host_item(suite, 'suite job log directory'), 'job') try: job_status_file = open(job_log_name + '.status', 'ab') except IOError: if cylc.flags.debug: import traceback traceback.print_exc() return for severity, message in messages: if message == TASK_OUTPUT_STARTED: job_id = os.getppid() if job_id > 1: # If os.getppid() returns 1, the original job process # is likely killed already job_status_file.write('%s=%s\n' % (CYLC_JOB_PID, job_id)) job_status_file.write('%s=%s\n' % (CYLC_JOB_INIT_TIME, event_time)) elif message == TASK_OUTPUT_SUCCEEDED: job_status_file.write( ('%s=%s\n' % (CYLC_JOB_EXIT, TASK_OUTPUT_SUCCEEDED.upper())) + ('%s=%s\n' % (CYLC_JOB_EXIT_TIME, event_time))) elif message.startswith(FAIL_MESSAGE_PREFIX): job_status_file.write( ('%s=%s\n' % ( CYLC_JOB_EXIT, message[len(FAIL_MESSAGE_PREFIX):])) + ('%s=%s\n' % (CYLC_JOB_EXIT_TIME, event_time))) elif message.startswith(ABORT_MESSAGE_PREFIX): job_status_file.write( ('%s=%s\n' % ( CYLC_JOB_EXIT, message[len(ABORT_MESSAGE_PREFIX):])) + ('%s=%s\n' % (CYLC_JOB_EXIT_TIME, event_time))) elif message.startswith(VACATION_MESSAGE_PREFIX): # Job vacated, remove entries related to current job job_status_file_name = job_status_file.name job_status_file.close() lines = [] for line in open(job_status_file_name): if not line.startswith('CYLC_JOB_'): lines.append(line) job_status_file = open(job_status_file_name, 'wb') for line in lines: job_status_file.write(line) job_status_file.write('%s=%s|%s|%s\n' % ( CYLC_MESSAGE, event_time, severity, message)) else: job_status_file.write('%s=%s|%s|%s\n' % ( CYLC_MESSAGE, event_time, severity, message)) try: job_status_file.close() except IOError: if cylc.flags.debug: import traceback traceback.print_exc()
def _append_job_status_file(suite, task_job, event_time, messages): """Write messages to job status file.""" job_log_name = os.getenv('CYLC_TASK_LOG_ROOT') if not job_log_name: job_log_name = os.path.join( glbl_cfg().get_derived_host_item(suite, 'suite job log directory'), 'job') try: job_status_file = open(job_log_name + '.status', 'a') except IOError: if cylc.flags.debug: import traceback traceback.print_exc() return for severity, message in messages: if message == TASK_OUTPUT_STARTED: job_id = os.getppid() if job_id > 1: # If os.getppid() returns 1, the original job process # is likely killed already job_status_file.write('%s=%s\n' % (CYLC_JOB_PID, job_id)) job_status_file.write('%s=%s\n' % (CYLC_JOB_INIT_TIME, event_time)) elif message == TASK_OUTPUT_SUCCEEDED: job_status_file.write( ('%s=%s\n' % (CYLC_JOB_EXIT, TASK_OUTPUT_SUCCEEDED.upper())) + ('%s=%s\n' % (CYLC_JOB_EXIT_TIME, event_time))) elif message.startswith(FAIL_MESSAGE_PREFIX): job_status_file.write( ('%s=%s\n' % (CYLC_JOB_EXIT, message[len(FAIL_MESSAGE_PREFIX):])) + ('%s=%s\n' % (CYLC_JOB_EXIT_TIME, event_time))) elif message.startswith(ABORT_MESSAGE_PREFIX): job_status_file.write( ('%s=%s\n' % (CYLC_JOB_EXIT, message[len(ABORT_MESSAGE_PREFIX):])) + ('%s=%s\n' % (CYLC_JOB_EXIT_TIME, event_time))) elif message.startswith(VACATION_MESSAGE_PREFIX): # Job vacated, remove entries related to current job job_status_file_name = job_status_file.name job_status_file.close() lines = [] for line in open(job_status_file_name): if not line.startswith('CYLC_JOB_'): lines.append(line) job_status_file = open(job_status_file_name, 'w') for line in lines: job_status_file.write(line) job_status_file.write( '%s=%s|%s|%s\n' % (CYLC_MESSAGE, event_time, severity, message)) else: job_status_file.write( '%s=%s|%s|%s\n' % (CYLC_MESSAGE, event_time, severity, message)) try: job_status_file.close() except IOError: if cylc.flags.debug: import traceback traceback.print_exc()
def _update_job_status_file(self, messages): """Write messages to job status file.""" job_log_name = os.getenv("CYLC_TASK_LOG_ROOT") job_status_file = None if job_log_name: try: job_status_file = open(job_log_name + ".status", "ab") except IOError as exc: if cylc.flags.debug: print >> sys.stderr, exc for i, message in enumerate(messages): if job_status_file: if message == TASK_OUTPUT_STARTED: job_status_file.write( ("%s=%s\n" % (self.CYLC_JOB_PID, os.getenv(self.CYLC_JOB_PID))) + ("%s=%s\n" % (self.CYLC_JOB_INIT_TIME, self.true_event_time))) elif message == TASK_OUTPUT_SUCCEEDED: job_status_file.write( ("%s=%s\n" % (self.CYLC_JOB_EXIT, TASK_OUTPUT_SUCCEEDED.upper())) + ("%s=%s\n" % (self.CYLC_JOB_EXIT_TIME, self.true_event_time))) elif message == TASK_OUTPUT_FAILED: job_status_file.write( "%s=%s\n" % (self.CYLC_JOB_EXIT_TIME, self.true_event_time)) elif message.startswith(self.FAIL_MESSAGE_PREFIX): job_status_file.write( "%s=%s\n" % (self.CYLC_JOB_EXIT, message.replace(self.FAIL_MESSAGE_PREFIX, ""))) elif message.startswith(self.VACATION_MESSAGE_PREFIX): # Job vacated, remove entries related to current job job_status_file_name = job_status_file.name job_status_file.close() lines = [] for line in open(job_status_file_name): if not line.startswith("CYLC_JOB_"): lines.append(line) job_status_file = open(job_status_file_name, "wb") for line in lines: job_status_file.write(line) job_status_file.write( "%s=%s|%s|%s\n" % (self.CYLC_MESSAGE, self.true_event_time, self.priority, message)) else: job_status_file.write( "%s=%s|%s|%s\n" % (self.CYLC_MESSAGE, self.true_event_time, self.priority, message)) messages[i] += ' at ' + self.true_event_time if job_status_file: try: job_status_file.close() except IOError as exc: if cylc.flags.debug: print >> sys.stderr, exc
def _update_job_status_file(self, messages): """Write messages to job status file.""" job_log_name = os.getenv("CYLC_TASK_LOG_ROOT") job_status_file = None if job_log_name: try: job_status_file = open(job_log_name + ".status", "ab") except IOError as exc: if cylc.flags.debug: print >>sys.stderr, exc for i, message in enumerate(messages): if job_status_file: if message == TASK_OUTPUT_STARTED: job_status_file.write( ("%s=%s\n" % ( self.CYLC_JOB_PID, os.getenv(self.CYLC_JOB_PID))) + ("%s=%s\n" % ( self.CYLC_JOB_INIT_TIME, self.true_event_time))) elif message == TASK_OUTPUT_SUCCEEDED: job_status_file.write( ("%s=%s\n" % (self.CYLC_JOB_EXIT, TASK_OUTPUT_SUCCEEDED.upper())) + ("%s=%s\n" % ( self.CYLC_JOB_EXIT_TIME, self.true_event_time))) elif message == TASK_OUTPUT_FAILED: job_status_file.write("%s=%s\n" % ( self.CYLC_JOB_EXIT_TIME, self.true_event_time)) elif message.startswith(self.FAIL_MESSAGE_PREFIX): job_status_file.write("%s=%s\n" % ( self.CYLC_JOB_EXIT, message.replace(self.FAIL_MESSAGE_PREFIX, ""))) elif message.startswith(self.VACATION_MESSAGE_PREFIX): # Job vacated, remove entries related to current job job_status_file_name = job_status_file.name job_status_file.close() lines = [] for line in open(job_status_file_name): if not line.startswith("CYLC_JOB_"): lines.append(line) job_status_file = open(job_status_file_name, "wb") for line in lines: job_status_file.write(line) job_status_file.write("%s=%s|%s|%s\n" % ( self.CYLC_MESSAGE, self.true_event_time, self.priority, message)) else: job_status_file.write("%s=%s|%s|%s\n" % ( self.CYLC_MESSAGE, self.true_event_time, self.priority, message)) messages[i] += ' at ' + self.true_event_time if job_status_file: try: job_status_file.close() except IOError as exc: if cylc.flags.debug: print >>sys.stderr, exc
def _jobs_poll_status_files(self, job_log_root, job_log_dir): """Helper 1 for self.jobs_poll(job_log_root, job_log_dirs).""" ctx = JobPollContext(job_log_dir) try: handle = open(os.path.join( job_log_root, ctx.job_log_dir, JOB_LOG_STATUS)) except IOError as exc: sys.stderr.write(str(exc) + "\n") return for line in handle: if "=" not in line: continue key, value = line.strip().split("=", 1) if key == self.CYLC_BATCH_SYS_NAME: ctx.batch_sys_name = value elif key == self.CYLC_BATCH_SYS_JOB_ID: ctx.batch_sys_job_id = value elif key == self.CYLC_BATCH_SYS_EXIT_POLLED: ctx.batch_sys_exit_polled = 1 elif key == CYLC_JOB_PID: ctx.pid = value elif key == self.CYLC_BATCH_SYS_JOB_SUBMIT_TIME: ctx.time_submit_exit = value elif key == CYLC_JOB_INIT_TIME: ctx.time_run = value elif key == CYLC_JOB_EXIT_TIME: ctx.time_run_exit = value elif key == CYLC_JOB_EXIT: if value == TASK_OUTPUT_SUCCEEDED.upper(): ctx.run_status = 0 else: ctx.run_status = 1 ctx.run_signal = value elif key == CYLC_MESSAGE: ctx.messages.append(value) handle.close() return ctx
def _jobs_poll_status_files(self, job_log_root, job_log_dir): """Helper 1 for self.jobs_poll(job_log_root, job_log_dirs).""" ctx = JobPollContext(job_log_dir) try: handle = open(os.path.join( job_log_root, ctx.job_log_dir, "job.status")) except IOError as exc: sys.stderr.write(str(exc) + "\n") return for line in handle: if "=" not in line: continue key, value = line.strip().split("=", 1) if key == self.CYLC_BATCH_SYS_NAME: ctx.batch_sys_name = value elif key == self.CYLC_BATCH_SYS_JOB_ID: ctx.batch_sys_job_id = value elif key == self.CYLC_BATCH_SYS_EXIT_POLLED: ctx.batch_sys_exit_polled = 1 elif key == TaskMessage.CYLC_JOB_PID: ctx.pid = value elif key == self.CYLC_BATCH_SYS_JOB_SUBMIT_TIME: ctx.time_submit_exit = value elif key == TaskMessage.CYLC_JOB_INIT_TIME: ctx.time_run = value elif key == TaskMessage.CYLC_JOB_EXIT_TIME: ctx.time_run_exit = value elif key == TaskMessage.CYLC_JOB_EXIT: if value == TASK_OUTPUT_SUCCEEDED.upper(): ctx.run_status = 0 else: ctx.run_status = 1 ctx.run_signal = value elif key == TaskMessage.CYLC_MESSAGE: ctx.messages.append(value) handle.close() return ctx
def _update_job_status_file(self, messages): """Write messages to job status file.""" job_log_name = os.getenv("CYLC_TASK_LOG_ROOT") if not job_log_name: return job_status_file = None try: job_status_file = open(job_log_name + ".status", "ab") except IOError: if cylc.flags.debug: import traceback traceback.print_exc() return for message in messages: if message == TASK_OUTPUT_STARTED: job_id = os.getppid() if job_id > 1: # If os.getppid() returns 1, the original job process # is likely killed already job_status_file.write("%s=%s\n" % (self.CYLC_JOB_PID, job_id)) job_status_file.write( "%s=%s\n" % (self.CYLC_JOB_INIT_TIME, self.true_event_time)) elif message == TASK_OUTPUT_SUCCEEDED: job_status_file.write( ("%s=%s\n" % (self.CYLC_JOB_EXIT, TASK_OUTPUT_SUCCEEDED.upper())) + ("%s=%s\n" % (self.CYLC_JOB_EXIT_TIME, self.true_event_time))) elif message.startswith(self.FAIL_MESSAGE_PREFIX): job_status_file.write( ("%s=%s\n" % (self.CYLC_JOB_EXIT, message[len(self.FAIL_MESSAGE_PREFIX):])) + ("%s=%s\n" % (self.CYLC_JOB_EXIT_TIME, self.true_event_time))) elif message.startswith(self.ABORT_MESSAGE_PREFIX): job_status_file.write( ("%s=%s\n" % (self.CYLC_JOB_EXIT, message[len(self.ABORT_MESSAGE_PREFIX):])) + ("%s=%s\n" % (self.CYLC_JOB_EXIT_TIME, self.true_event_time))) elif message.startswith(self.VACATION_MESSAGE_PREFIX): # Job vacated, remove entries related to current job job_status_file_name = job_status_file.name job_status_file.close() lines = [] for line in open(job_status_file_name): if not line.startswith("CYLC_JOB_"): lines.append(line) job_status_file = open(job_status_file_name, "wb") for line in lines: job_status_file.write(line) job_status_file.write("%s=%s|%s|%s\n" % (self.CYLC_MESSAGE, self.true_event_time, self.severity, message)) else: job_status_file.write("%s=%s|%s|%s\n" % (self.CYLC_MESSAGE, self.true_event_time, self.severity, message)) try: job_status_file.close() except IOError: if cylc.flags.debug: import traceback traceback.print_exc()