zhangjf dd8de5d96e refactor: APP_NAME从JAR文件自动推断
- APP_NAME不再写在env.properties,而是从lib/*.jar自动推断
- env.properties只保留INSTANCE_NAME和TENANT_ID(多租户场景使用)
- 所有脚本(start.sh/stop.sh/status.sh)统一从JAR文件获取APP_NAME
- 避免打包后所有服务的env.properties都一样导致APP_NAME冲突
2026-02-22 15:59:53 +08:00

86 lines
2.6 KiB
Bash
Executable File
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/bash
# 服务启动脚本
# 支持多租户模式:同一服务可部署多个实例(数据库连接不同)
# 获取脚本所在目录
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
APP_HOME=$(dirname "$SCRIPT_DIR")
# 自动从lib目录下的JAR文件推断APP_NAME
JAR_FILE=$(ls ${APP_HOME}/lib/*.jar 2>/dev/null | head -1)
if [ -z "$JAR_FILE" ]; then
echo "Error: No JAR file found in ${APP_HOME}/lib/"
exit 1
fi
APP_NAME=$(basename "$JAR_FILE" .jar)
# 加载环境变量配置
if [ -f "${APP_HOME}/conf/env.properties" ]; then
while IFS='=' read -r key value; do
[[ "$key" =~ ^#.*$ ]] && continue
[[ -z "$key" ]] && continue
key=$(echo "$key" | xargs)
value=$(echo "$value" | xargs)
# 跳过APP_NAME因为已从JAR文件推断
[[ "$key" == "APP_NAME" ]] && continue
export "$key=$value"
done < "${APP_HOME}/conf/env.properties"
fi
# 实例名称用于区分多租户实例默认与APP_NAME相同
INSTANCE_NAME=${INSTANCE_NAME:-${APP_NAME}}
# 日志目录使用INSTANCE_NAME区分不同实例
LOG_HOME="/datacfs/applogs/${INSTANCE_NAME}"
# PID文件路径使用INSTANCE_NAME
PID_FILE="${APP_HOME}/${INSTANCE_NAME}.pid"
# JVM参数可通过环境变量覆盖
JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200}"
# 日志参数从env.properties读取或使用默认值
LOG_OPTS="-Dlogging.file.path=${LOG_HOME}"
LOG_OPTS="$LOG_OPTS -Dspring.application.name=${APP_NAME}"
LOG_OPTS="$LOG_OPTS -Dlogging.level.root=${LOG_LEVEL_ROOT:-INFO}"
LOG_OPTS="$LOG_OPTS -Dlogging.level.app=${LOG_LEVEL_APP:-DEBUG}"
LOG_OPTS="$LOG_OPTS -Dlogging.pattern.console=${LOG_PATTERN}"
# 多租户参数
TENANT_OPTS=""
if [ -n "${TENANT_ID}" ]; then
TENANT_OPTS="-DTENANT_ID=${TENANT_ID}"
fi
# 配置文件路径
CONFIG_OPTS="--spring.config.location=${APP_HOME}/conf/application.yml"
# 检查是否已运行
if [ -f "$PID_FILE" ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null 2>&1; then
echo "${INSTANCE_NAME} is already running (PID: $PID)"
exit 1
fi
fi
# 创建日志目录
mkdir -p ${LOG_HOME}
# 启动服务
echo "Starting ${INSTANCE_NAME}..."
echo " APP_NAME: ${APP_NAME}"
echo " INSTANCE_NAME: ${INSTANCE_NAME}"
echo " APP_HOME: ${APP_HOME}"
echo " LOG_HOME: ${LOG_HOME}"
echo " JAVA_OPTS: ${JAVA_OPTS}"
if [ -n "${TENANT_ID}" ]; then
echo " TENANT_ID: ${TENANT_ID}"
fi
nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -jar $JAR_FILE $CONFIG_OPTS > /dev/null 2>&1 &
# 保存PID
echo $! > $PID_FILE
echo "${INSTANCE_NAME} started (PID: $(cat $PID_FILE))"