Spaces:
Sleeping
Sleeping
Add SIGHUP signal handling in SimulationRunner for Unix systems
Browse files
backend/app/services/simulation_runner.py
CHANGED
|
@@ -1270,6 +1270,11 @@ class SimulationRunner:
|
|
| 1270 |
# 保存原有的信号处理器
|
| 1271 |
original_sigint = signal.getsignal(signal.SIGINT)
|
| 1272 |
original_sigterm = signal.getsignal(signal.SIGTERM)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1273 |
|
| 1274 |
def cleanup_handler(signum=None, frame=None):
|
| 1275 |
"""信号处理器:先清理模拟进程,再调用原处理器"""
|
|
@@ -1283,6 +1288,13 @@ class SimulationRunner:
|
|
| 1283 |
original_sigint(signum, frame)
|
| 1284 |
elif signum == signal.SIGTERM and callable(original_sigterm):
|
| 1285 |
original_sigterm(signum, frame)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1286 |
else:
|
| 1287 |
# 如果原处理器不可调用(如 SIG_DFL),则使用默认行为
|
| 1288 |
raise KeyboardInterrupt
|
|
@@ -1296,6 +1308,9 @@ class SimulationRunner:
|
|
| 1296 |
signal.signal(signal.SIGTERM, cleanup_handler)
|
| 1297 |
# SIGINT: Ctrl+C
|
| 1298 |
signal.signal(signal.SIGINT, cleanup_handler)
|
|
|
|
|
|
|
|
|
|
| 1299 |
except ValueError:
|
| 1300 |
# 不在主线程中,只能使用 atexit
|
| 1301 |
logger.warning("无法注册信号处理器(不在主线程),仅使用 atexit")
|
|
|
|
| 1270 |
# 保存原有的信号处理器
|
| 1271 |
original_sigint = signal.getsignal(signal.SIGINT)
|
| 1272 |
original_sigterm = signal.getsignal(signal.SIGTERM)
|
| 1273 |
+
# SIGHUP 只在 Unix 系统存在(macOS/Linux),Windows 没有
|
| 1274 |
+
original_sighup = None
|
| 1275 |
+
has_sighup = hasattr(signal, 'SIGHUP')
|
| 1276 |
+
if has_sighup:
|
| 1277 |
+
original_sighup = signal.getsignal(signal.SIGHUP)
|
| 1278 |
|
| 1279 |
def cleanup_handler(signum=None, frame=None):
|
| 1280 |
"""信号处理器:先清理模拟进程,再调用原处理器"""
|
|
|
|
| 1288 |
original_sigint(signum, frame)
|
| 1289 |
elif signum == signal.SIGTERM and callable(original_sigterm):
|
| 1290 |
original_sigterm(signum, frame)
|
| 1291 |
+
elif has_sighup and signum == signal.SIGHUP:
|
| 1292 |
+
# SIGHUP: 终端关闭时发送
|
| 1293 |
+
if callable(original_sighup):
|
| 1294 |
+
original_sighup(signum, frame)
|
| 1295 |
+
else:
|
| 1296 |
+
# 默认行为:正常退出
|
| 1297 |
+
sys.exit(0)
|
| 1298 |
else:
|
| 1299 |
# 如果原处理器不可调用(如 SIG_DFL),则使用默认行为
|
| 1300 |
raise KeyboardInterrupt
|
|
|
|
| 1308 |
signal.signal(signal.SIGTERM, cleanup_handler)
|
| 1309 |
# SIGINT: Ctrl+C
|
| 1310 |
signal.signal(signal.SIGINT, cleanup_handler)
|
| 1311 |
+
# SIGHUP: 终端关闭(仅 Unix 系统)
|
| 1312 |
+
if has_sighup:
|
| 1313 |
+
signal.signal(signal.SIGHUP, cleanup_handler)
|
| 1314 |
except ValueError:
|
| 1315 |
# 不在主线程中,只能使用 atexit
|
| 1316 |
logger.warning("无法注册信号处理器(不在主线程),仅使用 atexit")
|