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))