部署脚本
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
#!/usr/bin/env bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
# 将 deploy.sh 和 bms-admin.jar 放在应用目录中,然后执行:
|
||||
# bash deploy.sh start|stop|restart|status
|
||||
# 服务使用当前执行用户运行,控制台输出追加到 logs/console.log。
|
||||
|
||||
APP_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
|
||||
JAR_NAME="bms-admin.jar"
|
||||
JAR_PATH="$APP_DIR/$JAR_NAME"
|
||||
LOG_DIR="$APP_DIR/logs"
|
||||
CONSOLE_LOG="$LOG_DIR/console.log"
|
||||
JAVA_BIN="/www/server/java/jdk-17.0.8/bin/java"
|
||||
|
||||
usage() {
|
||||
echo "用法:bash deploy.sh {start|stop|restart|status}"
|
||||
}
|
||||
|
||||
# 精确匹配由本目录启动的 bms-admin.jar,避免误停 ES 或其他 Java 服务。
|
||||
find_app_pids() {
|
||||
local pid arg jar_arg cwd i
|
||||
local -a args
|
||||
|
||||
while read -r pid; do
|
||||
[[ -r "/proc/$pid/cmdline" ]] || continue
|
||||
args=()
|
||||
while IFS= read -r -d '' arg; do
|
||||
args+=("$arg")
|
||||
done < "/proc/$pid/cmdline"
|
||||
|
||||
jar_arg=""
|
||||
for ((i = 1; i + 1 < ${#args[@]}; i++)); do
|
||||
if [[ "${args[i]}" == "-jar" ]]; then
|
||||
jar_arg="${args[i + 1]}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
case "$jar_arg" in
|
||||
"$JAR_PATH")
|
||||
echo "$pid"
|
||||
;;
|
||||
"$JAR_NAME"|"./$JAR_NAME")
|
||||
cwd="$(readlink -f "/proc/$pid/cwd" 2>/dev/null || true)"
|
||||
[[ "$cwd" == "$APP_DIR" ]] && echo "$pid" || true
|
||||
;;
|
||||
esac
|
||||
done < <(pgrep -x java || true)
|
||||
}
|
||||
|
||||
resolve_java() {
|
||||
if [[ ! -x "$JAVA_BIN" ]]; then
|
||||
JAVA_BIN="$(command -v java || true)"
|
||||
fi
|
||||
if [[ -z "$JAVA_BIN" || ! -x "$JAVA_BIN" ]]; then
|
||||
echo "错误:找不到 Java。"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
start_app() {
|
||||
local pids
|
||||
pids="$(find_app_pids)"
|
||||
if [[ -n "$pids" ]]; then
|
||||
echo "$JAR_NAME 已在运行,PID: $(tr '\n' ' ' <<< "$pids")"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ ! -f "$JAR_PATH" ]]; then
|
||||
echo "错误:找不到 $JAR_PATH"
|
||||
return 1
|
||||
fi
|
||||
resolve_java || return 1
|
||||
|
||||
mkdir -p "$LOG_DIR"
|
||||
touch "$CONSOLE_LOG"
|
||||
echo "以 $(id -un) 用户启动 $JAR_NAME(prod)……"
|
||||
nohup "$JAVA_BIN" -jar "$JAR_PATH" --spring.profiles.active=prod >> "$CONSOLE_LOG" 2>&1 &
|
||||
|
||||
sleep 2
|
||||
pids="$(find_app_pids)"
|
||||
if [[ -z "$pids" ]]; then
|
||||
echo "启动失败,最近日志如下:"
|
||||
tail -n 50 "$CONSOLE_LOG" || true
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "启动成功,PID: $(tr '\n' ' ' <<< "$pids")"
|
||||
echo "实时日志:tail -f $CONSOLE_LOG"
|
||||
}
|
||||
|
||||
stop_app() {
|
||||
local pids pid remaining
|
||||
pids="$(find_app_pids)"
|
||||
if [[ -z "$pids" ]]; then
|
||||
echo "$JAR_NAME 当前未运行。"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "正在停止 $JAR_NAME,PID: $(tr '\n' ' ' <<< "$pids")"
|
||||
while read -r pid; do
|
||||
[[ -n "$pid" ]] && kill -TERM "$pid" 2>/dev/null || true
|
||||
done <<< "$pids"
|
||||
|
||||
for _ in {1..30}; do
|
||||
[[ -z "$(find_app_pids)" ]] && break
|
||||
sleep 1
|
||||
done
|
||||
|
||||
remaining="$(find_app_pids)"
|
||||
if [[ -n "$remaining" ]]; then
|
||||
echo "服务未在 30 秒内退出,强制停止 PID: $(tr '\n' ' ' <<< "$remaining")"
|
||||
while read -r pid; do
|
||||
[[ -n "$pid" ]] && kill -KILL "$pid" 2>/dev/null || true
|
||||
done <<< "$remaining"
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
remaining="$(find_app_pids)"
|
||||
if [[ -n "$remaining" ]]; then
|
||||
echo "错误:服务仍在运行,PID: $(tr '\n' ' ' <<< "$remaining");请检查执行用户和进程权限。"
|
||||
return 1
|
||||
fi
|
||||
echo "$JAR_NAME 已停止。"
|
||||
}
|
||||
|
||||
show_status() {
|
||||
local pids
|
||||
pids="$(find_app_pids)"
|
||||
if [[ -n "$pids" ]]; then
|
||||
echo "$JAR_NAME 正在运行,PID: $(tr '\n' ' ' <<< "$pids")"
|
||||
else
|
||||
echo "$JAR_NAME 当前未运行。"
|
||||
fi
|
||||
}
|
||||
|
||||
case "${1:-}" in
|
||||
start)
|
||||
start_app
|
||||
;;
|
||||
stop)
|
||||
stop_app
|
||||
;;
|
||||
restart)
|
||||
stop_app && start_app
|
||||
;;
|
||||
status)
|
||||
show_status
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user