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

## 修改目标

- 修复 `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`](/Users/wkc/Desktop/ccdi/ccdi/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`](/Users/wkc/Desktop/ccdi/ccdi/docs/tests/scripts/test-restart-java-backend.sh)
  - 增加对 `APP_MARKER` 的静态校验，防止后续移除托管标记
- 新增 [`docs/tests/scripts/test-restart-java-backend-stop-scope.sh`](/Users/wkc/Desktop/ccdi/ccdi/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 服务逻辑
