#!/bin/bash # 服务启动脚本 # 支持多租户模式:同一服务可部署多个实例(数据库连接不同) # 获取脚本所在目录 SCRIPT_DIR=$(dirname "$(readlink -f "$0")") APP_HOME=$(dirname "$SCRIPT_DIR") # 加载函数:读取properties文件 load_properties() { local file="$1" if [ -f "$file" ]; then while IFS='=' read -r key value; do [[ "$key" =~ ^#.*$ ]] && continue [[ -z "$key" ]] && continue key=$(echo "$key" | xargs) value=$(echo "$value" | xargs) # 跳过空值 [[ -z "$value" ]] && continue export "$key=$value" done < "$file" fi } # 1. 加载统一环境配置 load_properties "${APP_HOME}/conf/env.properties" # 2. 加载服务个性化配置(覆盖统一配置) load_properties "${APP_HOME}/conf/service.properties" # 3. 设置默认值 APP_NAME=${APP_NAME:-"unknown"} # INSTANCE_NAME: 如果为空或为字面值${APP_NAME},则使用APP_NAME if [[ -z "${INSTANCE_NAME}" ]] || [[ "${INSTANCE_NAME}" == '\${APP_NAME}' ]]; then INSTANCE_NAME=${APP_NAME} fi TENANT_ID=${TENANT_ID:-""} # 4. 主类(从service.properties读取,必须配置) MAIN_CLASS=${MAIN_CLASS:-""} if [ -z "$MAIN_CLASS" ]; then echo "Error: MAIN_CLASS not configured in service.properties" exit 1 fi # 5. ClassPath(lib目录所有jar + conf目录) if [ ! -d "${APP_HOME}/lib" ]; then echo "Error: lib directory not found: ${APP_HOME}/lib" exit 1 fi CLASSPATH="${APP_HOME}/lib/*:${APP_HOME}/conf" # 6. 日志目录(使用INSTANCE_NAME区分不同实例) LOG_HOME="/datacfs/applogs/${INSTANCE_NAME}" # 7. PID文件路径 PID_FILE="${APP_HOME}/${INSTANCE_NAME}.pid" # JVM参数(可通过环境变量覆盖) JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200}" # 日志目录参数(其他日志配置在application.yml/logback-spring.xml中) LOG_OPTS="-Dlogging.file.path=${LOG_HOME}" # 多租户参数 TENANT_OPTS="" if [ -n "${TENANT_ID}" ]; then TENANT_OPTS="-DTENANT_ID=${TENANT_ID}" fi # 检查是否已运行 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 " MAIN_CLASS: ${MAIN_CLASS}" echo " CLASSPATH: ${CLASSPATH}" echo " LOG_HOME: ${LOG_HOME}" echo " JAVA_OPTS: ${JAVA_OPTS}" if [ -n "${TENANT_ID}" ]; then echo " TENANT_ID: ${TENANT_ID}" fi # 启动命令:java -cp lib/*:conf MainClass nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -cp "$CLASSPATH" $MAIN_CLASS > /dev/null 2>&1 & # 保存PID echo $! > $PID_FILE echo "${INSTANCE_NAME} started (PID: $(cat $PID_FILE))"