Beispiel #1
0
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()
Beispiel #2
0
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()
Beispiel #3
0
 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
Beispiel #4
0
 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
Beispiel #5
0
    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
Beispiel #6
0
    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
Beispiel #7
0
 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()