666ghj commited on
Commit
693db81
·
1 Parent(s): 16dc4d0

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")