#!/bin/bash # AIGC Backend 启动脚本 # 使用方法: ./startup.sh [start|stop|restart|status] # 应用配置 APP_NAME="aigc-backend" JAR_NAME="aigc-backend-0.0.1-SNAPSHOT.jar" # 可以通过环境变量覆盖 JAR 路径 JAR_PATH="${JAR_PATH:-$JAR_NAME}" # Java 路径配置 # 如果系统中 java 命令不在 PATH 中,可以在这里指定完整路径 # 宝塔面板默认 Java 路径: /www/server/java/jdk1.8.0_371/bin/java JAVA_CMD="${JAVA_CMD:-/www/server/java/jdk1.8.0_371/bin/java}" # 检查 Java 是否可用 check_java() { if ! command -v ${JAVA_CMD} &> /dev/null; then echo -e "${RED}错误: 找不到 Java 命令${NC}" echo "请确保 Java 已安装并配置在 PATH 中" echo "或者设置 JAVA_CMD 环境变量指定 Java 路径" echo "" echo "示例:" echo " export JAVA_CMD=/usr/local/java/bin/java" echo " ./startup.sh start" exit 1 fi # 显示 Java 版本 echo "Java 版本:" ${JAVA_CMD} -version 2>&1 | head -n 1 echo "" } # JVM 参数配置 JVM_OPTS="${JVM_OPTS:--Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200}" # Spring Boot 配置 SPRING_PROFILES_ACTIVE="${SPRING_PROFILES_ACTIVE:-prod}" SERVER_PORT="${SERVER_PORT:-20006}" # 日志配置 LOG_DIR="logs" LOG_FILE="${LOG_DIR}/${APP_NAME}.log" PID_FILE="${APP_NAME}.pid" # 创建日志目录 mkdir -p ${LOG_DIR} # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 检查 JAR 文件是否存在 check_jar() { if [ ! -f "${JAR_PATH}" ]; then echo -e "${RED}错误: JAR 文件不存在: ${JAR_PATH}${NC}" echo "请确保已经执行 mvn clean package 构建项目" exit 1 fi } # 获取进程 ID get_pid() { if [ -f "${PID_FILE}" ]; then cat "${PID_FILE}" fi } # 检查应用是否运行 is_running() { local pid=$(get_pid) if [ -n "$pid" ] && ps -p $pid > /dev/null 2>&1; then return 0 else return 1 fi } # 启动应用 start() { check_java check_jar if is_running; then local pid=$(get_pid) echo -e "${YELLOW}应用已经在运行中 (PID: $pid)${NC}" exit 0 fi echo -e "${GREEN}正在启动 ${APP_NAME}...${NC}" echo "JAR 文件: ${JAR_PATH}" echo "JVM 参数: ${JVM_OPTS}" echo "Spring Profile: ${SPRING_PROFILES_ACTIVE}" echo "启动端口: ${SERVER_PORT}" echo "日志文件: ${LOG_FILE}" # 启动应用 nohup ${JAVA_CMD} ${JVM_OPTS} \ -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE} \ -Dserver.port=${SERVER_PORT} \ -jar ${JAR_PATH} \ > ${LOG_FILE} 2>&1 & # 保存 PID echo $! > ${PID_FILE} # 等待应用启动 sleep 3 if is_running; then local pid=$(get_pid) echo -e "${GREEN}✓ ${APP_NAME} 启动成功 (PID: $pid)${NC}" echo "查看日志: tail -f ${LOG_FILE}" else echo -e "${RED}✗ ${APP_NAME} 启动失败${NC}" echo "请查看日志文件: ${LOG_FILE}" rm -f ${PID_FILE} exit 1 fi } # 停止应用 stop() { if ! is_running; then echo -e "${YELLOW}应用未运行${NC}" rm -f ${PID_FILE} exit 0 fi local pid=$(get_pid) echo -e "${YELLOW}正在停止 ${APP_NAME} (PID: $pid)...${NC}" # 发送 TERM 信号 kill $pid # 等待进程结束 local count=0 while is_running && [ $count -lt 30 ]; do sleep 1 count=$((count + 1)) echo -n "." done echo "" if is_running; then echo -e "${RED}应用未能正常停止,强制终止...${NC}" kill -9 $pid sleep 1 fi if is_running; then echo -e "${RED}✗ 停止失败${NC}" exit 1 else echo -e "${GREEN}✓ ${APP_NAME} 已停止${NC}" rm -f ${PID_FILE} fi } # 重启应用 restart() { echo -e "${GREEN}重启 ${APP_NAME}...${NC}" stop sleep 2 start } # 查看状态 status() { if is_running; then local pid=$(get_pid) echo -e "${GREEN}${APP_NAME} 正在运行 (PID: $pid)${NC}" # 显示进程信息 echo "" echo "进程信息:" ps -f -p $pid # 显示最近的日志 if [ -f "${LOG_FILE}" ]; then echo "" echo "最近日志 (最后 10 行):" tail -n 10 ${LOG_FILE} fi else echo -e "${RED}${APP_NAME} 未运行${NC}" rm -f ${PID_FILE} fi } # 查看日志 logs() { if [ -f "${LOG_FILE}" ]; then tail -f ${LOG_FILE} else echo -e "${RED}日志文件不存在: ${LOG_FILE}${NC}" fi } # 主函数 case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; logs) logs ;; *) echo "使用方法: $0 {start|stop|restart|status|logs}" echo "" echo "命令说明:" echo " start - 启动应用" echo " stop - 停止应用" echo " restart - 重启应用" echo " status - 查看应用状态" echo " logs - 实时查看日志" echo "" echo "环境变量:" echo " JAR_PATH - JAR 文件路径 (默认: ${JAR_NAME})" echo " JVM_OPTS - JVM 参数 (默认: -Xms512m -Xmx1024m)" echo " SPRING_PROFILES_ACTIVE - Spring 配置文件 (默认: prod)" echo " SERVER_PORT - 启动端口 (默认: 20006)" echo "" echo "示例:" echo " ./startup.sh start" echo " JVM_OPTS='-Xms1g -Xmx2g' ./startup.sh start" echo " SERVER_PORT=8080 ./startup.sh start" echo " SPRING_PROFILES_ACTIVE=dev ./startup.sh restart" exit 1 ;; esac exit 0