Add SIGHUP signal handling in SimulationRunner for Unix systems
This commit is contained in:
parent
067855f7b5
commit
8bd768718e
1 changed files with 15 additions and 0 deletions
|
|
@ -1270,6 +1270,11 @@ class SimulationRunner:
|
||||||
# 保存原有的信号处理器
|
# 保存原有的信号处理器
|
||||||
original_sigint = signal.getsignal(signal.SIGINT)
|
original_sigint = signal.getsignal(signal.SIGINT)
|
||||||
original_sigterm = signal.getsignal(signal.SIGTERM)
|
original_sigterm = signal.getsignal(signal.SIGTERM)
|
||||||
|
# SIGHUP 只在 Unix 系统存在(macOS/Linux),Windows 没有
|
||||||
|
original_sighup = None
|
||||||
|
has_sighup = hasattr(signal, 'SIGHUP')
|
||||||
|
if has_sighup:
|
||||||
|
original_sighup = signal.getsignal(signal.SIGHUP)
|
||||||
|
|
||||||
def cleanup_handler(signum=None, frame=None):
|
def cleanup_handler(signum=None, frame=None):
|
||||||
"""信号处理器:先清理模拟进程,再调用原处理器"""
|
"""信号处理器:先清理模拟进程,再调用原处理器"""
|
||||||
|
|
@ -1283,6 +1288,13 @@ class SimulationRunner:
|
||||||
original_sigint(signum, frame)
|
original_sigint(signum, frame)
|
||||||
elif signum == signal.SIGTERM and callable(original_sigterm):
|
elif signum == signal.SIGTERM and callable(original_sigterm):
|
||||||
original_sigterm(signum, frame)
|
original_sigterm(signum, frame)
|
||||||
|
elif has_sighup and signum == signal.SIGHUP:
|
||||||
|
# SIGHUP: 终端关闭时发送
|
||||||
|
if callable(original_sighup):
|
||||||
|
original_sighup(signum, frame)
|
||||||
|
else:
|
||||||
|
# 默认行为:正常退出
|
||||||
|
sys.exit(0)
|
||||||
else:
|
else:
|
||||||
# 如果原处理器不可调用(如 SIG_DFL),则使用默认行为
|
# 如果原处理器不可调用(如 SIG_DFL),则使用默认行为
|
||||||
raise KeyboardInterrupt
|
raise KeyboardInterrupt
|
||||||
|
|
@ -1296,6 +1308,9 @@ class SimulationRunner:
|
||||||
signal.signal(signal.SIGTERM, cleanup_handler)
|
signal.signal(signal.SIGTERM, cleanup_handler)
|
||||||
# SIGINT: Ctrl+C
|
# SIGINT: Ctrl+C
|
||||||
signal.signal(signal.SIGINT, cleanup_handler)
|
signal.signal(signal.SIGINT, cleanup_handler)
|
||||||
|
# SIGHUP: 终端关闭(仅 Unix 系统)
|
||||||
|
if has_sighup:
|
||||||
|
signal.signal(signal.SIGHUP, cleanup_handler)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
# 不在主线程中,只能使用 atexit
|
# 不在主线程中,只能使用 atexit
|
||||||
logger.warning("无法注册信号处理器(不在主线程),仅使用 atexit")
|
logger.warning("无法注册信号处理器(不在主线程),仅使用 atexit")
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue