热重载监督者优雅响应 Ctrl+C:先等子进程收尾再回收

- run_supervisor 捕获 KeyboardInterrupt:不打 traceback、退出码归零,
  给子进程 _GRACE_SECONDS=5s 自行收尾窗口(打退出日志、关连接),
  超时才 taskkill /F /T;文件变更重启仍立即强杀(子进程不知情不会自己退)
- main() 兜底监督循环间隙的 Ctrl+C
- start.bat 改为发射器:start 新开独立控制台跑 cmd /c 命令行(非批
  处理),Ctrl+C 直接停进程,规避「终止批处理操作吗(Y/N)」,发射器
  即退;bat 保持纯 ASCII 防 GBK 乱码
This commit is contained in:
snowy-yang committed 2026-09-24 21:55:17 +08:00
1 parent 6b6492dc8d
commit d71809d144
3 files changed
+33 -5

No files matched your search

+5 -1
View File
@@ -82,7 +82,11 @@ def main(argv: list[str] | None = None) -> None:
# 保证「监控的树」与「实际加载的配置」一致
root = _project_root()
# 监督者不配置日志:子进程自己会配,避免两边抢写同一个日志文件
code = reload.run_supervisor([sys.executable, "-m", "musicbot"], root)
try:
code = reload.run_supervisor([sys.executable, "-m", "musicbot"], root)
except KeyboardInterrupt:
# 兜底 run_supervisor 循环间隙的 Ctrl+C,同样不打印 traceback
code = 0
sys.exit(code)
try:
asyncio.run(amain())