From 54eabaebd8736e7f37cb7a41dd5aa9409af5d751 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Wed, 1 Apr 2026 11:06:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=BD=E7=95=A5=E9=83=A8=E7=BD=B2=E8=84=9A?= =?UTF-8?q?=E6=9C=ACdefunct=E8=BF=9B=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/prod/deploy_from_package.sh | 2 +- bin/prod/deploy_from_package_test.sh | 33 +++++++++++++++++++ ...-01-production-one-click-deploy-defunct.md | 30 +++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 doc/implementation-report-2026-04-01-production-one-click-deploy-defunct.md diff --git a/bin/prod/deploy_from_package.sh b/bin/prod/deploy_from_package.sh index 363785c..3d8e1c3 100755 --- a/bin/prod/deploy_from_package.sh +++ b/bin/prod/deploy_from_package.sh @@ -132,7 +132,7 @@ deploy_frontend_dist() { collect_backend_pids() { ps -ef | awk -v marker="$BACKEND_MARKER" -v jar="$BACKEND_JAR_TARGET" ' - index($0, marker) > 0 && index($0, jar) > 0 {print $2} + index($0, "") == 0 && index($0, marker) > 0 && index($0, jar) > 0 {print $2} ' | xargs 2>/dev/null || true } diff --git a/bin/prod/deploy_from_package_test.sh b/bin/prod/deploy_from_package_test.sh index 89bd8c5..064de09 100755 --- a/bin/prod/deploy_from_package_test.sh +++ b/bin/prod/deploy_from_package_test.sh @@ -171,6 +171,38 @@ test_multiple_release_zip_should_fail() { cleanup_release_dir "$release_dir" } +test_defunct_process_should_be_ignored() { + release_dir=$(mktemp -d) + backend_port=$(find_free_port) + trap 'cleanup_release_dir "$release_dir"' EXIT INT TERM + + prepare_release_dir "$release_dir" "$backend_port" + mkdir -p "$release_dir/fake-ps-bin" + cat > "$release_dir/fake-ps-bin/ps" < -Dloan.pricing.home=$release_dir -jar $release_dir/backend/ruoyi-admin.jar +PSOUT + exit 0 +fi +/bin/ps "\$@" +EOF + chmod +x "$release_dir/fake-ps-bin/ps" + + ( + cd "$release_dir" + PATH="$release_dir/fake-ps-bin:/usr/bin:/bin" ./deploy_from_package.sh + ) + + backend_pid=$(cat "$release_dir/backend/backend.pid") + kill -0 "$backend_pid" 2>/dev/null || fail "expected backend pid to be running when defunct process is ignored" + + trap - EXIT INT TERM + cleanup_release_dir "$release_dir" +} + test_should_use_ps_ef_for_process_detection() { if rg -n 'pgrep' "$SCRIPT_UNDER_TEST" >/dev/null 2>&1; then fail "expected deploy_from_package.sh not to depend on pgrep" @@ -190,6 +222,7 @@ main() { test_should_use_ps_ef_for_process_detection test_deploy_success test_multiple_release_zip_should_fail + test_defunct_process_should_be_ignored printf 'PASS: deploy_from_package tests\n' } diff --git a/doc/implementation-report-2026-04-01-production-one-click-deploy-defunct.md b/doc/implementation-report-2026-04-01-production-one-click-deploy-defunct.md new file mode 100644 index 0000000..d2823c2 --- /dev/null +++ b/doc/implementation-report-2026-04-01-production-one-click-deploy-defunct.md @@ -0,0 +1,30 @@ +# 生产一键部署脚本忽略 defunct 进程实施记录 + +## 问题现象 +- 执行部署脚本时出现报错: + - `检测到后端已在运行,请先停止旧进程` + +## 根因分析 +- 当前脚本使用 `ps -ef` 收集托管后端进程 +- 简化后的实现只要在 `ps -ef` 中匹配到: + - `-Dloan.pricing.home=<脚本目录>` + - `backend/ruoyi-admin.jar` + 就会返回对应 PID +- 如果系统中存在已经退出但仍显示为 `` 的历史 Java 进程,该 PID 也会被误判为“旧后端仍在运行” +- 随后 `start_backend()` 在启动前再次调用 `collect_backend_pids()`,因此会直接报“检测到后端已在运行,请先停止旧进程” + +## 修改内容 +- 更新 `bin/prod/deploy_from_package.sh` +- 在 `collect_backend_pids()` 中继续使用 `ps -ef`,但显式忽略包含 `` 的进程行 +- 更新 `bin/prod/deploy_from_package_test.sh` +- 新增自测场景: + - `ps -ef` 输出中存在匹配当前脚本标记和 jar 路径的 `` 进程 + - 脚本应忽略该记录并继续正常部署 + +## 验证结果 +- 已执行 `sh -n bin/prod/deploy_from_package.sh` +- 已执行 `sh bin/prod/deploy_from_package_test.sh` +- 自测结果确认: + - 正常部署链路通过 + - 多个发布 zip 失败场景通过 + - `` 进程不会再阻塞新后端启动