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.flow.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.flow.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 = get_suite_run_job_dir(suite, task_job, 'job') try: job_status_file = open(job_log_name + '.status', 'a') except IOError: if cylc.flow.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.flow.flags.debug: import traceback traceback.print_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(f"{exc}\n") return for line in handle: if "=" not in line: continue key, value = line.strip().split("=", 1) if key == self.CYLC_JOB_RUNNER_NAME: ctx.job_runner_name = value elif key == self.CYLC_JOB_ID: ctx.job_id = value elif key == self.CYLC_JOB_RUNNER_EXIT_POLLED: ctx.job_runner_exit_polled = 1 elif key == CYLC_JOB_PID: ctx.pid = value elif key == self.CYLC_JOB_RUNNER_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_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