stop_prod.sh 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/bin/bash
  2. # 生产环境停止脚本
  3. # 用于停止 FastAPI 后端服务
  4. set -e # 遇到错误立即退出
  5. # 获取脚本所在目录
  6. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  7. # 颜色输出
  8. GREEN='\033[0;32m'
  9. YELLOW='\033[1;33m'
  10. RED='\033[0;31m'
  11. NC='\033[0m' # No Color
  12. PID_FILE="$SCRIPT_DIR/backend.pid"
  13. if [ -f "$PID_FILE" ]; then
  14. PID=$(cat "$PID_FILE")
  15. if ps -p "$PID" > /dev/null 2>&1; then
  16. echo -e "${YELLOW}🛑 正在停止服务 (PID: $PID)...${NC}"
  17. kill "$PID"
  18. # 等待进程结束
  19. for i in {1..10}; do
  20. if ! ps -p "$PID" > /dev/null 2>&1; then
  21. break
  22. fi
  23. sleep 1
  24. done
  25. # 如果还在运行,强制杀死
  26. if ps -p "$PID" > /dev/null 2>&1; then
  27. echo -e "${YELLOW}⚠️ 强制停止服务...${NC}"
  28. kill -9 "$PID" 2>/dev/null || true
  29. fi
  30. rm -f "$PID_FILE"
  31. echo -e "${GREEN}✅ 服务已停止${NC}"
  32. else
  33. echo -e "${YELLOW}⚠️ 服务进程不存在 (PID: $PID)${NC}"
  34. rm -f "$PID_FILE"
  35. fi
  36. else
  37. # 尝试通过进程名查找
  38. PIDS=$(pgrep -f "uvicorn main:app" || true)
  39. if [ -n "$PIDS" ]; then
  40. echo -e "${YELLOW}🛑 正在停止服务 (通过进程名查找)...${NC}"
  41. echo "$PIDS" | xargs kill 2>/dev/null || true
  42. sleep 2
  43. # 如果还在运行,强制杀死
  44. REMAINING=$(pgrep -f "uvicorn main:app" || true)
  45. if [ -n "$REMAINING" ]; then
  46. echo -e "${YELLOW}⚠️ 强制停止服务...${NC}"
  47. echo "$REMAINING" | xargs kill -9 2>/dev/null || true
  48. fi
  49. echo -e "${GREEN}✅ 服务已停止${NC}"
  50. else
  51. echo -e "${YELLOW}⚠️ 未找到运行中的服务${NC}"
  52. fi
  53. fi