diff --git a/src/snek/app.py b/src/snek/app.py index 37218a6..2033a64 100644 --- a/src/snek/app.py +++ b/src/snek/app.py @@ -3,6 +3,7 @@ import logging import pathlib import ssl import uuid +import signal from datetime import datetime from snek import snode @@ -210,6 +211,10 @@ class Application(BaseApplication): # app.loop = asyncio.get_running_loop() app.executor = ThreadPoolExecutor(max_workers=200) app.loop.set_default_executor(self.executor) + for sig in (signal.SIGINT, signal.SIGTERM): + app.loop.add_signal_handler( + sig, lambda: asyncio.create_task(self.services.container.shutdown()) + ) async def create_task(self, task): await self.tasks.put(task) diff --git a/src/snek/service/container.py b/src/snek/service/container.py index cae55ba..0beaf2c 100644 --- a/src/snek/service/container.py +++ b/src/snek/service/container.py @@ -12,6 +12,9 @@ class ContainerService(BaseService): self.compose = ComposeFileManager(self.compose_path,self.container_event_handler) self.event_listeners = {} + async def shutdown(self): + return await self.compose.shutdown() + async def add_event_listener(self, name, event,event_handler): if not name in self.event_listeners: self.event_listeners[name] = {} diff --git a/src/snek/system/docker.py b/src/snek/system/docker.py index c390b94..840f361 100644 --- a/src/snek/system/docker.py +++ b/src/snek/system/docker.py @@ -17,6 +17,17 @@ class ComposeFileManager: self.running_instances = {} self.event_handler = event_handler + async def shutdown(self): + print("Stopping all sessions") + for name in self.list_instances(): + proc = self.running_instances.get(name) + if not proc: + continue + if proc['proc'].returncode == None: + print("Stopping",name) + await proc['proc'].stop() + print("Stopped",name,"gracefully") + def _load(self): try: with open(self.compose_path) as f: