#!/bin/bash # ==================================================== # 工作日志服务平台 - 应用启动脚本 # ==================================================== # 应用配置 APP_NAME="worklog-api" APP_JAR="worklog-api-1.0.0.jar" APP_HOME="/opt/worklog/${APP_NAME}" APP_JAR_PATH="${APP_HOME}/lib/${APP_JAR}" MAIN_CLASS="com.wjbl.worklog.WorklogApplication" # Classpath 配置(lib 目录下所有 JAR + conf 目录) CLASSPATH="${APP_HOME}/lib/*:${APP_HOME}/conf" # 配置文件加载函数 load_properties() { local file=$1 if [ -f "${file}" ]; then echo "加载配置文件: ${file}" while IFS='=' read -r key value; do # 跳过注释和空行 [[ ${key} =~ ^#.*$ ]] && continue [[ -z ${key} ]] && continue # 去除前后空格 key=$(echo ${key} | xargs) value=$(echo ${value} | xargs) # 导出环境变量 if [ -n "${key}" ] && [ -n "${value}" ]; then export "${key}=${value}" fi done < "${file}" else echo "警告: 配置文件不存在 ${file}" fi } # 1. 加载统一环境配置 load_properties "${APP_HOME}/conf/env.properties" # 2. 加载服务个性化配置(覆盖同名参数) load_properties "${APP_HOME}/conf/service.properties" # JVM 配置(从环境变量读取,如果未设置则使用默认值) JVM_XMS=${JVM_XMS:-512m} JVM_XMX=${JVM_XMX:-1024m} JVM_METASPACE_SIZE=${JVM_METASPACE_SIZE:-128m} JVM_MAX_METASPACE_SIZE=${JVM_MAX_METASPACE_SIZE:-256m} JVM_GC_TYPE=${JVM_GC_TYPE:-G1GC} JVM_MAX_GC_PAUSE_MILLIS=${JVM_MAX_GC_PAUSE_MILLIS:-200} JVM_OPTS="-Xms${JVM_XMS} -Xmx${JVM_XMX} -XX:MetaspaceSize=${JVM_METASPACE_SIZE} -XX:MaxMetaspaceSize=${JVM_MAX_METASPACE_SIZE}" JVM_OPTS="${JVM_OPTS} -XX:+Use${JVM_GC_TYPE} -XX:MaxGCPauseMillis=${JVM_MAX_GC_PAUSE_MILLIS}" JVM_OPTS="${JVM_OPTS} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${APP_HOME}/logs/heapdump.hprof" JVM_OPTS="${JVM_OPTS} -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${APP_HOME}/logs/gc.log" # Spring Boot 配置(从环境变量读取) SPRING_PROFILE=${SPRING_PROFILES_ACTIVE:-prod} SPRING_OPTS="--spring.profiles.active=${SPRING_PROFILE}" # 日志文件 LOG_DIR="${APP_HOME}/logs" CONSOLE_LOG="${LOG_DIR}/console.log" PID_FILE="${APP_HOME}/${APP_NAME}.pid" # 创建日志目录 mkdir -p "${LOG_DIR}" # 检查应用是否已运行 if [ -f "${PID_FILE}" ]; then PID=$(cat "${PID_FILE}") if ps -p ${PID} > /dev/null 2>&1; then echo "应用已在运行中,PID: ${PID}" exit 1 else echo "发现残留 PID 文件,正在清理..." rm -f "${PID_FILE}" fi fi # 检查 JAR 文件是否存在 if [ ! -f "${APP_JAR_PATH}" ]; then echo "ERROR: 找不到应用 JAR 文件: ${APP_JAR_PATH}" exit 1 fi # 启动应用 echo "=========================================" echo "启动应用: ${APP_NAME}" echo "主类: ${MAIN_CLASS}" echo "Classpath: ${CLASSPATH}" echo "=========================================" nohup java ${JVM_OPTS} -cp "${CLASSPATH}" ${MAIN_CLASS} ${SPRING_OPTS} \ > "${CONSOLE_LOG}" 2>&1 & PID=$! echo ${PID} > "${PID_FILE}" echo "应用启动中,PID: ${PID}" echo "日志文件: ${CONSOLE_LOG}" # 等待应用启动 sleep 5 # 检查应用是否启动成功 if ps -p ${PID} > /dev/null 2>&1; then echo "应用启动成功!" echo "查看日志: tail -f ${CONSOLE_LOG}" exit 0 else echo "ERROR: 应用启动失败,请查看日志" rm -f "${PID_FILE}" exit 1 fi