#!/bin/bash # ============================================ # 中华药典 AI Agent — Java 后端启动脚本 # ============================================ set -e APP_DIR="/opt/pharmacopoeia-ai/backend-java" JAR_FILE="$APP_DIR/target/pharmacopoeia-ai-1.0.0.jar" LOG_DIR="/var/log/pharmacopoeia" PID_FILE="$APP_DIR/app.pid" # 加载 .env 环境变量 if [ -f /opt/pharmacopoeia-ai/.env ]; then set -a source /opt/pharmacopoeia-ai/.env set +a fi # 创建日志目录 mkdir -p "$LOG_DIR" # ---- 通用函数 ---- running() { [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null } start() { if running; then echo "后端已在运行中 (PID: $(cat "$PID_FILE"))" return 1 fi if [ ! -f "$JAR_FILE" ]; then echo "JAR 不存在,正在编译..." cd "$APP_DIR" mvn clean package -DskipTests -q fi echo "启动后端..." cd "$APP_DIR" # JVM 参数 JVM_OPTS="-Xms512m -Xmx2g" JVM_OPTS="$JVM_OPTS -XX:+UseG1GC" JVM_OPTS="$JVM_OPTS -Dfile.encoding=UTF-8" JVM_OPTS="$JVM_OPTS -Djava.security.egd=file:/dev/./urandom" nohup java $JVM_OPTS -jar "$JAR_FILE" \ >> "$LOG_DIR/backend.log" 2>&1 & echo $! > "$PID_FILE" echo "已启动 (PID: $(cat "$PID_FILE"))" echo "日志: $LOG_DIR/backend.log" echo "" tail -f "$LOG_DIR/backend.log" } stop() { if ! running; then echo "后端未运行" rm -f "$PID_FILE" return 0 fi PID=$(cat "$PID_FILE") echo "停止后端 (PID: $PID)..." kill "$PID" # 等待最多 30 秒 for i in $(seq 1 30); do if ! kill -0 "$PID" 2>/dev/null; then echo "已停止" rm -f "$PID_FILE" return 0 fi sleep 1 done # 强制终止 echo "超时,强制终止..." kill -9 "$PID" 2>/dev/null rm -f "$PID_FILE" echo "已强制停止" } restart() { stop sleep 2 start } status() { if running; then echo "✅ 后端运行中 (PID: $(cat "$PID_FILE"))" else echo "❌ 后端未运行" fi } logs() { tail -100 "$LOG_DIR/backend.log" } case "${1:-start}" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; logs) logs ;; *) echo "用法: $0 {start|stop|restart|status|logs}" exit 1 ;; esac