diff --git a/src/execo/conductor.py b/src/execo/conductor.py index 9669a9bdb4005499bc19c608f346695cc8784833..afa16e2641c945e437aac3f047c744a6fb9ddbbb 100644 --- a/src/execo/conductor.py +++ b/src/execo/conductor.py @@ -376,6 +376,7 @@ class _Conductor(object): reaper_thread = threading.Thread(target = self.__reaper_thread_func, name = "Reaper") reaper_thread.setDaemon(True) reaper_thread.start() + threading.Thread(target = process._trigger_start_handlers).start() def __handle_update_process(self, process): # intended to be called from conductor thread diff --git a/src/execo/process.py b/src/execo/process.py index 479174e9a9d1668482890b8c4dd4c05975603f2d..a634fee8d138d1a83e5631a3c63f4c8b6a145c6b 100644 --- a/src/execo/process.py +++ b/src/execo/process.py @@ -1101,6 +1101,10 @@ class Process(ProcessBase): self.end_date = time.time() self.ended_condition.notify_all() self.ended_event.set() + if self.error: + self._log_terminated() + + def _trigger_start_handlers(self): for handler in list(self.lifecycle_handlers): try: handler.start(self) @@ -1108,7 +1112,6 @@ class Process(ProcessBase): logger.error("process lifecycle handler %s start raised exception for process %s:\n%s" % ( handler, self, format_exc())) if self.error: - self._log_terminated() for handler in list(self.lifecycle_handlers): try: handler.end(self) @@ -1250,6 +1253,9 @@ class Process(ProcessBase): self.ended_condition.notify_all() self.ended_event.set() self._log_terminated() + threading.Thread(target = self._trigger_end_handlers).start() + + def _trigger_end_handlers(self): for handler in list(self.lifecycle_handlers): try: handler.end(self) @@ -1405,12 +1411,7 @@ class TaktukProcess(ProcessBase): #IGNORE:W0223 self.started_condition.notify_all() self.started_event.set() logger.debug(style.emph("start:") + " %s" % (str(self),)) - for handler in list(self.lifecycle_handlers): - try: - handler.start(self) - except Exception as e: - logger.error("process lifecycle handler %s start raised exception for process %s:\n%s" % ( - handler, self, format_exc())) + self._trigger_start_handlers() return self def _set_terminated(self, exit_code = None, error = False, error_reason = None, timeouted = None, forced_kill = None): @@ -1442,12 +1443,7 @@ class TaktukProcess(ProcessBase): #IGNORE:W0223 self.ended_condition.notify_all() self.ended_event.set() self._log_terminated() - for handler in list(self.lifecycle_handlers): - try: - handler.end(self) - except Exception as e: - logger.error("process lifecycle handler %s end raised exception for process %s:\n%s" % ( - handler, self, format_exc())) + threading.Thread(target = self._trigger_end_handlers).start() # def write(self, s): # buf = "%i input [ %s ]\n" % (self._taktuk_index + 1, _escape_taktuk_cmd_args(s))