Skip to content

Commit 5762231

Browse files
committed
Capture and forward subprocess output
Send all process output to a file For easier retrieval of output on failure
1 parent 94fed0d commit 5762231

File tree

6 files changed

+169
-125
lines changed

6 files changed

+169
-125
lines changed

ipyparallel/apps/baseapp.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ def reinit_logging(self):
202202
# Start logging to the new log file
203203
log_filename = self.name + u'-' + str(os.getpid()) + u'.log'
204204
logfile = os.path.join(log_dir, log_filename)
205+
if sys.__stderr__:
206+
print(f"Sending logs to {logfile}", file=sys.__stderr__)
205207
open_log_file = open(logfile, 'w')
206208
else:
207209
open_log_file = None

ipyparallel/cluster/_win32support.py

Lines changed: 0 additions & 72 deletions
This file was deleted.

ipyparallel/cluster/app.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -250,15 +250,14 @@ def _classes_default(self):
250250
daemonize = Bool(
251251
False,
252252
config=True,
253-
help="""Daemonize the ipcluster program. This implies --log-to-file.
253+
help="""Launch the cluster and immediately exit.
254+
255+
.. versionchanged:: 7.0
256+
No longer leaves the ipcluster process itself running.
257+
Prior to 7.0, --daemonize did not work on Windows.
254258
""",
255259
)
256260

257-
@observe('daemonize')
258-
def _daemonize_changed(self, change):
259-
if change['new']:
260-
self.log_to_file = True
261-
262261
early_shutdown = Integer(
263262
30,
264263
config=True,
@@ -382,6 +381,9 @@ def engines_stopped_early(self, stop_data):
382381
a public interface.
383382
"""
384383
)
384+
engine_output = self.engine_launcher.get_output(remove=True)
385+
if engine_output:
386+
self.log.error(f"Engine output:\n{engine_output}")
385387
self.loop.add_callback(self.stop_cluster)
386388

387389
return self.engines_stopped(stop_data)
@@ -471,7 +473,9 @@ def engines_stopped(self, r):
471473
async def start_cluster(self):
472474
await self.cluster.start_cluster()
473475
if self.daemonize:
474-
self.log.info(f"Leaving cluster running: {self.cluster.cluster_file}")
476+
print(
477+
f"Leaving cluster running: {self.cluster.cluster_file}", file=sys.stderr
478+
)
475479
self.loop.add_callback(self.loop.stop)
476480
self.cluster._controller.on_stop(self.controller_stopped)
477481
self.watch_engines()

ipyparallel/cluster/cluster.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,9 @@ def from_dict(cls, d, **kwargs):
357357
cls = self.engine_launcher_class = import_item(engine_info["class"])
358358
for engine_set_id, engine_state in engine_info.get("sets", {}).items():
359359
self._engine_sets[engine_set_id] = cls.from_dict(
360-
engine_state, parent=self
360+
engine_state,
361+
engine_set_id=engine_set_id,
362+
parent=self,
361363
)
362364

363365
return self
@@ -503,6 +505,7 @@ async def start_engines(self, n=None, engine_set_id=None, **kwargs):
503505
log=self.log,
504506
profile_dir=self.profile_dir,
505507
cluster_id=self.cluster_id,
508+
engine_set_id=engine_set_id,
506509
**kwargs,
507510
)
508511
if n is None:
@@ -547,6 +550,8 @@ async def stop_engines(self, engine_set_id=None):
547550
r = engine_set.stop()
548551
if inspect.isawaitable(r):
549552
await r
553+
# retrieve and cleanup output files
554+
engine_set.get_output(remove=True)
550555
self._engine_sets.pop(engine_set_id)
551556
self.update_cluster_file()
552557

@@ -608,6 +613,9 @@ async def stop_controller(self):
608613
if inspect.isawaitable(r):
609614
await r
610615

616+
if self._controller:
617+
self._controller.get_output(remove=True)
618+
611619
self._controller = None
612620
self.update_cluster_file()
613621

0 commit comments

Comments
 (0)