start-java.sh 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #!/bin/bash
  2. # ============================================
  3. # 中华药典 AI Agent — Java 后端启动脚本
  4. # ============================================
  5. set -e
  6. APP_DIR="/opt/pharmacopoeia-ai/backend-java"
  7. JAR_FILE="$APP_DIR/target/pharmacopoeia-ai-1.0.0.jar"
  8. LOG_DIR="/var/log/pharmacopoeia"
  9. PID_FILE="$APP_DIR/app.pid"
  10. # 加载 .env 环境变量
  11. if [ -f /opt/pharmacopoeia-ai/.env ]; then
  12. set -a
  13. source /opt/pharmacopoeia-ai/.env
  14. set +a
  15. fi
  16. # 创建日志目录
  17. mkdir -p "$LOG_DIR"
  18. # ---- 通用函数 ----
  19. running() {
  20. [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null
  21. }
  22. start() {
  23. if running; then
  24. echo "后端已在运行中 (PID: $(cat "$PID_FILE"))"
  25. return 1
  26. fi
  27. if [ ! -f "$JAR_FILE" ]; then
  28. echo "JAR 不存在,正在编译..."
  29. cd "$APP_DIR"
  30. mvn clean package -DskipTests -q
  31. fi
  32. echo "启动后端..."
  33. cd "$APP_DIR"
  34. # JVM 参数
  35. JVM_OPTS="-Xms512m -Xmx2g"
  36. JVM_OPTS="$JVM_OPTS -XX:+UseG1GC"
  37. JVM_OPTS="$JVM_OPTS -Dfile.encoding=UTF-8"
  38. JVM_OPTS="$JVM_OPTS -Djava.security.egd=file:/dev/./urandom"
  39. nohup java $JVM_OPTS -jar "$JAR_FILE" \
  40. >> "$LOG_DIR/backend.log" 2>&1 &
  41. echo $! > "$PID_FILE"
  42. echo "已启动 (PID: $(cat "$PID_FILE"))"
  43. sleep 3
  44. if running; then
  45. echo "✅ 启动成功"
  46. echo "日志: $LOG_DIR/backend.log"
  47. else
  48. echo "❌ 启动失败,查看日志:"
  49. tail -20 "$LOG_DIR/backend.log"
  50. rm -f "$PID_FILE"
  51. return 1
  52. fi
  53. }
  54. stop() {
  55. if ! running; then
  56. echo "后端未运行"
  57. rm -f "$PID_FILE"
  58. return 0
  59. fi
  60. PID=$(cat "$PID_FILE")
  61. echo "停止后端 (PID: $PID)..."
  62. kill "$PID"
  63. # 等待最多 30 秒
  64. for i in $(seq 1 30); do
  65. if ! kill -0 "$PID" 2>/dev/null; then
  66. echo "已停止"
  67. rm -f "$PID_FILE"
  68. return 0
  69. fi
  70. sleep 1
  71. done
  72. # 强制终止
  73. echo "超时,强制终止..."
  74. kill -9 "$PID" 2>/dev/null
  75. rm -f "$PID_FILE"
  76. echo "已强制停止"
  77. }
  78. restart() {
  79. stop
  80. sleep 2
  81. start
  82. }
  83. status() {
  84. if running; then
  85. echo "✅ 后端运行中 (PID: $(cat "$PID_FILE"))"
  86. else
  87. echo "❌ 后端未运行"
  88. fi
  89. }
  90. logs() {
  91. tail -100 "$LOG_DIR/backend.log"
  92. }
  93. case "${1:-start}" in
  94. start) start ;;
  95. stop) stop ;;
  96. restart) restart ;;
  97. status) status ;;
  98. logs) logs ;;
  99. *)
  100. echo "用法: $0 {start|stop|restart|status|logs}"
  101. exit 1
  102. ;;
  103. esac