AIGC/AIGC-admin/backend/startup.sh

247 lines
5.8 KiB
Bash
Raw Permalink Normal View History

2026-02-27 14:37:19 +08:00
#!/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