忽略部署脚本defunct进程
This commit is contained in:
@@ -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, "<defunct>") == 0 && index($0, marker) > 0 && index($0, jar) > 0 {print $2}
|
||||
' | xargs 2>/dev/null || true
|
||||
}
|
||||
|
||||
|
||||
@@ -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" <<EOF
|
||||
#!/bin/sh
|
||||
if [ "\$1" = "-ef" ]; then
|
||||
cat <<'PSOUT'
|
||||
UID PID PPID C STIME TTY TIME CMD
|
||||
root 99999 1 0 00:00 ? 00:00:00 [java] <defunct> -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'
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
# 生产一键部署脚本忽略 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>` 进程不会再阻塞新后端启动
|
||||
Reference in New Issue
Block a user