start.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #!/bin/bash
  2. # 定义默认启动模式及路径
  3. SERVER="all"
  4. WEB_CHAT_START_PAGE_JARS="./server"
  5. KILL_TIMEOUT=5 # 等待进程退出的最长时间(秒)
  6. # 参数处理(支持带.jar后缀和不带的情况)
  7. if [ $# -gt 0 ]; then
  8. SERVER="${1%.*}" # 去除可能的.jar后缀
  9. fi
  10. echo "Starting server: $SERVER"
  11. # 打包阶段
  12. echo "=== Webchat packaging begins ==="
  13. mvn clean package -DskipTests=true
  14. echo "=== Webchat packaging completed ==="
  15. # 清理并创建jars目录
  16. rm -rf "$WEB_CHAT_START_PAGE_JARS"
  17. mkdir -p "$WEB_CHAT_START_PAGE_JARS"
  18. echo "Old jars removed"
  19. # 复制所有jar到目标目录
  20. find . -path "*/target/*.jar" -exec cp {} "$WEB_CHAT_START_PAGE_JARS" \;
  21. cd "$WEB_CHAT_START_PAGE_JARS" || exit 1
  22. # 定义进程终止函数
  23. kill_old_process() {
  24. local jar_name=$1
  25. local pid_list=$(pgrep -f "java.*$jar_name")
  26. if [ -n "$pid_list" ]; then
  27. echo "Found existing process(es) for $jar_name: $pid_list"
  28. # 优雅终止
  29. kill $pid_list
  30. echo "Sent SIGTERM to process(es), waiting for termination..."
  31. # 等待进程退出
  32. local timeout=0
  33. while kill -0 $pid_list 2>/dev/null && [ $timeout -lt $KILL_TIMEOUT ]; do
  34. sleep 1
  35. ((timeout++))
  36. done
  37. # 强制终止未退出的进程
  38. if kill -0 $pid_list 2>/dev/null; then
  39. echo "Force killing process(es)..."
  40. kill -9 $pid_list
  41. fi
  42. # 二次确认
  43. if pgrep -f "java.*$jar_name" >/dev/null; then
  44. echo "Error: Failed to kill process for $jar_name!" >&2
  45. return 1
  46. fi
  47. fi
  48. return 0
  49. }
  50. # 启动逻辑
  51. if [ "$SERVER" == "all" ]; then
  52. echo "Starting ALL services..."
  53. for jar in *.jar; do
  54. service_name="${jar%.*}"
  55. # 终止旧进程
  56. if ! kill_old_process "$jar"; then
  57. exit 1
  58. fi
  59. # 启动新进程
  60. echo "Starting $service_name..."
  61. nohup java -jar "$jar" > "${service_name}.log" 2>&1 &
  62. done
  63. echo "All services restarted in background."
  64. else
  65. target_jar="${SERVER}.jar"
  66. if [ -f "$target_jar" ]; then
  67. # 终止旧进程
  68. if ! kill_old_process "$target_jar"; then
  69. exit 1
  70. fi
  71. # 启动新进程
  72. echo "Starting $target_jar..."
  73. nohup java -jar "$target_jar" > "${SERVER}.log" 2>&1 &
  74. echo "Service restarted. Tracking logs:"
  75. tail -100f "${SERVER}.log"
  76. else
  77. echo "Error: Jar file $target_jar not found!"
  78. echo "Available jars:"
  79. ls -1 *.jar | sed 's/.jar$//'
  80. exit 1
  81. fi
  82. fi
  83. # 端口冲突检查(备用方案)
  84. check_port_conflict() {
  85. local port=$1
  86. if lsof -i :$port &>/dev/null; then
  87. echo "Port $port is still in use after process restart!" >&2
  88. return 1
  89. fi
  90. return 0
  91. }