diff --git a/uvicorn/workers.py b/uvicorn/workers.py index c7d16ff6e..73caf073d 100644 --- a/uvicorn/workers.py +++ b/uvicorn/workers.py @@ -76,9 +76,20 @@ def init_signals(self) -> None: # Don't let SIGUSR1 disturb active requests by interrupting system calls signal.siginterrupt(signal.SIGUSR1, False) + def _install_sigquit_handler(self) -> None: + """Install a SIGQUIT handler on workers. + + - https://github.com/encode/uvicorn/issues/1116 + - https://github.com/benoitc/gunicorn/issues/2604 + """ + + loop = asyncio.get_running_loop() + loop.add_signal_handler(signal.SIGQUIT, self.handle_exit, signal.SIGQUIT, None) + async def _serve(self) -> None: self.config.app = self.wsgi server = Server(config=self.config) + self._install_sigquit_handler() await server.serve(sockets=self.sockets) if not server.started: sys.exit(Arbiter.WORKER_BOOT_ERROR)