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

49 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 后端启停脚本停机范围收敛实施记录
## 修改目标
- 修复 `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 服务逻辑