#!/bin/bash # ==================================================== # 工作日志服务平台 - 应用启动脚本 # ==================================================== # 获取脚本所在目录的上级目录作为应用根目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" APP_HOME="$(cd "${SCRIPT_DIR}/.." && pwd)" # 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" # 服务名称(从 service.properties 读取,默认值) APP_NAME=${APP_NAME:-worklog-api} # 主启动类(从 service.properties 读取,默认值) MAIN_CLASS=${MAIN_CLASS:-com.wjbl.worklog.WorklogApplication} # 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} # 日志目录(从 env.properties 读取,默认值) LOG_DIR=${LOG_PATH:-/datacfs/applogs/${APP_NAME}} STDOUT_LOG="${LOG_DIR}/stdout.log" PID_FILE="${APP_HOME}/${APP_NAME}.pid" 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=${LOG_DIR}/heapdump.hprof" JVM_OPTS="${JVM_OPTS} -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${LOG_DIR}/gc.log" # 创建日志目录 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 # 检查 lib 目录是否存在 if [ ! -d "${APP_HOME}/lib" ]; then echo "ERROR: 找不到 lib 目录: ${APP_HOME}/lib" exit 1 fi # 启动应用 echo "=========================================" echo "启动应用: ${APP_NAME}" echo "应用目录: ${APP_HOME}" echo "主类: ${MAIN_CLASS}" echo "Classpath: ${CLASSPATH}" echo "日志目录: ${LOG_DIR}" echo "=========================================" nohup java ${JVM_OPTS} -cp "${CLASSPATH}" ${MAIN_CLASS} \ > "${STDOUT_LOG}" 2>&1 & PID=$! echo ${PID} > "${PID_FILE}" echo "应用启动中,PID: ${PID}" echo "日志文件: ${STDOUT_LOG}" # 等待应用启动 sleep 5 # 检查应用是否启动成功 if ps -p ${PID} > /dev/null 2>&1; then echo "应用启动成功!" echo "查看日志: tail -f ${STDOUT_LOG}" exit 0 else echo "ERROR: 应用启动失败,请查看日志" rm -f "${PID_FILE}" exit 1 fi