Files
loan-pricing/doc/implementation-report-2026-04-01-production-one-click-deploy-defunct.md
2026-04-01 11:06:53 +08:00

1.3 KiB

生产一键部署脚本忽略 defunct 进程实施记录

问题现象

  • 执行部署脚本时出现报错:
    • 检测到后端已在运行,请先停止旧进程

根因分析

  • 当前脚本使用 ps -ef 收集托管后端进程
  • 简化后的实现只要在 ps -ef 中匹配到:
    • -Dloan.pricing.home=<脚本目录>
    • backend/ruoyi-admin.jar 就会返回对应 PID
  • 如果系统中存在已经退出但仍显示为 <defunct> 的历史 Java 进程,该 PID 也会被误判为“旧后端仍在运行”
  • 随后 start_backend() 在启动前再次调用 collect_backend_pids(),因此会直接报“检测到后端已在运行,请先停止旧进程”

修改内容

  • 更新 bin/prod/deploy_from_package.sh
  • collect_backend_pids() 中继续使用 ps -ef,但显式忽略包含 <defunct> 的进程行
  • 更新 bin/prod/deploy_from_package_test.sh
  • 新增自测场景:
    • ps -ef 输出中存在匹配当前脚本标记和 jar 路径的 <defunct> 进程
    • 脚本应忽略该记录并继续正常部署

验证结果

  • 已执行 sh -n bin/prod/deploy_from_package.sh
  • 已执行 sh bin/prod/deploy_from_package_test.sh
  • 自测结果确认:
    • 正常部署链路通过
    • 多个发布 zip 失败场景通过
    • <defunct> 进程不会再阻塞新后端启动