From ff7af9c80e70c5fdc7368ec9e280e6fc7bba9143 Mon Sep 17 00:00:00 2001 From: SunnyQjm Date: Thu, 4 Jan 2024 20:51:45 +0800 Subject: [PATCH] fix(framework): SysomFramework should kill all child while receive killed signal --- environment/0_env/requirements.txt | 3 ++- environment/1_sdk/setup_sysom_utils.py | 3 ++- environment/1_sdk/sysom_utils/framework.py | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/environment/0_env/requirements.txt b/environment/0_env/requirements.txt index 917d5365..74eabad4 100644 --- a/environment/0_env/requirements.txt +++ b/environment/0_env/requirements.txt @@ -38,4 +38,5 @@ uvicorn[standard]==0.16.0 # xlrd==2.0.1 # prometheus-client==0.16.0 pyyaml==6.0 -pyyaml-include==1.3 \ No newline at end of file +pyyaml-include==1.3 +psutil==5.9.7 diff --git a/environment/1_sdk/setup_sysom_utils.py b/environment/1_sdk/setup_sysom_utils.py index 902b880b..bd289b81 100644 --- a/environment/1_sdk/setup_sysom_utils.py +++ b/environment/1_sdk/setup_sysom_utils.py @@ -24,7 +24,8 @@ setuptools.setup( "aiofiles==0.8.0", "anyio>=3.6.2", "asyncer==0.0.2", - "fastapi==0.83.0" + "fastapi==0.83.0", + "psutil==5.9.7" ], classifiers=[ "Programming Language :: Python :: 3", diff --git a/environment/1_sdk/sysom_utils/framework.py b/environment/1_sdk/sysom_utils/framework.py index b6737024..a7c71f1f 100644 --- a/environment/1_sdk/sysom_utils/framework.py +++ b/environment/1_sdk/sysom_utils/framework.py @@ -43,8 +43,30 @@ class SysomFramework: cls._config = config cls._framework_plug_mag = FrameworkPlugMag(config) cls.init_logger(config) + cls.catch_kill_sig_then_kill_all_child() return cls + @classmethod + def catch_kill_sig_then_kill_all_child(cls): + """Catch kill signal and kill all child process + """ + def signal_handler(signum, frame): + parent = psutil.Process(pid) + for child in parent.children(recursive=True): # 获取所有子进程 + child.kill() # 结束子进程 + exit(1) + import signal + import os + import psutil + + pid = os.getpid() + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + signal.signal(signal.SIGHUP, signal_handler) + signal.signal(signal.SIGQUIT, signal_handler) + signal.signal(signal.SIGABRT, signal_handler) + @classmethod def init_logger(cls, config: ConfigParser): """Init clogger