|
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