Files
ccdi/docs/reports/implementation/2026-03-30-restart-java-backend-stop-scope-fix.md

2.6 KiB
Raw Blame History

后端启停脚本停机范围收敛实施记录

修改目标

  • 修复 bin/restart_java_backend.sh 在执行 stop / restart 时可能误杀非脚本托管 Java 进程的问题
  • 保持现有 java -jar ruoyi-admin.jar 启动方式不变,仅收敛停机识别范围

根因分析

  • 原脚本在 stop_backend() 中通过 collect_pids() 同时合并以下来源后统一执行 kill
    • logs/backend-java.pid 中记录的 PID
    • 监听 62318 端口的进程
    • 命令行中包含 ruoyi-admin.jar 关键字的进程
  • 该逻辑会把“不是由本脚本拉起、但恰好占用端口或命中关键字”的外部进程也纳入停机列表,导致关闭后端时误杀其他进程。

修改内容

  • 调整 bin/restart_java_backend.sh
    • 新增 APP_MARKER="-Dccdi.backend.root=$ROOT_DIR",启动时把仓库根路径标记写入 Java 启动参数
    • 新增 is_managed_backend_pid(),只把带有脚本标记的 Java 进程视为脚本托管进程
    • collect_pids() 改为仅收集:
      • PID_FILE 中仍存活且校验通过的进程
      • 命令行里带脚本标记的进程
    • 不再把“端口占用者”或“仅命中 jar 名的进程”直接纳入停机目标
    • status 增加提示:若未发现脚本托管进程,但 62318 被其他进程占用,会明确输出占用 PID避免误判为脚本自身后端
  • 调整 docs/tests/scripts/test-restart-java-backend.sh
    • 增加对 APP_MARKER 的静态校验,防止后续移除托管标记
  • 新增 docs/tests/scripts/test-restart-java-backend-stop-scope.sh
    • 在临时目录复制启停脚本
    • 启动一个未托管的外部占口进程
    • 验证执行 stop 后该外部进程仍然存活,防止回归到误杀外部进程的行为

验证记录

  • 执行 sh docs/tests/scripts/test-restart-java-backend-stop-scope.sh
    • 结果:通过
    • 说明:已验证 stop 不会误杀未由脚本托管的占口进程
  • 执行 sh docs/tests/scripts/test-restart-java-backend.sh
    • 结果:通过
    • 说明:已验证脚本仍使用 java -jar ruoyi-admin.jar 启动,且保留托管进程标记
  • 执行 sh -n bin/restart_java_backend.sh
    • 结果:通过
    • 说明:脚本语法正确

影响范围

  • 仅影响本地后端启停辅助脚本与对应测试脚本
  • 不涉及 Java 业务代码、数据库、前端页面及 Mock 服务逻辑