|
10 | 10 | import re
|
11 | 11 | import signal
|
12 | 12 | import sys
|
| 13 | +from functools import partial |
13 | 14 |
|
14 | 15 | import zmq
|
15 | 16 | from IPython.core.profiledir import ProfileDir
|
@@ -308,18 +309,39 @@ def init_cluster(self):
|
308 | 309 |
|
309 | 310 | def init_signal(self):
|
310 | 311 | # Setup signals
|
| 312 | + for signame in ("SIGUSR1", "SIGUSR2", "SIGINFO"): |
| 313 | + try: |
| 314 | + signum = getattr(signal, signame) |
| 315 | + except AttributeError: |
| 316 | + self.log.debug(f"Not forwarding {signame}") |
| 317 | + pass |
| 318 | + else: |
| 319 | + self.log.debug(f"Forwarding {signame} to engines") |
| 320 | + signal.signal(signum, self.relay_signal) |
311 | 321 | signal.signal(signal.SIGINT, self.sigint_handler)
|
| 322 | + signal.signal(signal.SIGTERM, self.sigint_handler) |
| 323 | + |
| 324 | + def relay_signal(self, signum, frame): |
| 325 | + self.log.debug(f"Received signal {signum} received, relaying to engines...") |
| 326 | + self.loop.add_callback_from_signal(partial(self.cluster.signal_engines, signum)) |
| 327 | + |
| 328 | + def sigint_handler(self, signum, frame): |
| 329 | + return self.relay_signal(signum, frame) |
| 330 | + |
| 331 | + def sigterm_handler(self, signum, frame): |
| 332 | + self.log.debug(f"Received signal {signum} received, stopping launchers...") |
| 333 | + self.loop.add_callback_from_signal(self.stop_cluster) |
312 | 334 |
|
313 | 335 | def engines_started_ok(self):
|
314 | 336 | self.log.info("Engines appear to have started successfully")
|
315 | 337 | self.early_shutdown = 0
|
316 | 338 |
|
317 | 339 | async def start_engines(self):
|
318 | 340 | try:
|
319 |
| - await self.cluster.start_engines(self.n) |
| 341 | + await self.cluster.start_engines() |
320 | 342 | except:
|
321 | 343 | self.log.exception("Engine start failed")
|
322 |
| - raise |
| 344 | + self.exit(1) |
323 | 345 |
|
324 | 346 | if self.daemonize:
|
325 | 347 | self.loop.add_callback(self.loop.stop)
|
@@ -374,10 +396,6 @@ async def stop_cluster(self, r=None):
|
374 | 396 | await self.cluster.stop_cluster()
|
375 | 397 | self.loop.add_callback(self.loop.stop)
|
376 | 398 |
|
377 |
| - def sigint_handler(self, signum, frame): |
378 |
| - self.log.debug("SIGINT received, stopping launchers...") |
379 |
| - self.loop.add_callback_from_signal(self.stop_cluster) |
380 |
| - |
381 | 399 | def start_logging(self):
|
382 | 400 | # Remove old log files of the controller and engine
|
383 | 401 | if self.clean_logs:
|
@@ -463,6 +481,11 @@ def controller_stopped(self, stop_data):
|
463 | 481 | self.log.warning("Controller stopped. Shutting down.")
|
464 | 482 | self.loop.add_callback(self.stop_cluster)
|
465 | 483 |
|
| 484 | + def sigint_handler(self, signum, frame): |
| 485 | + """Unlike engines, SIGINT shuts down `ipcluster start`""" |
| 486 | + self.log.debug(f"Received signal {signum} received, stopping launchers...") |
| 487 | + self.loop.add_callback_from_signal(self.stop_cluster) |
| 488 | + |
466 | 489 | def start(self):
|
467 | 490 | """Start the app for the start subcommand."""
|
468 | 491 | # First see if the cluster is already running
|
|
0 commit comments