#!/bin/bash # 知识工具服务停止脚本 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 项目根目录 PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PID_FILE="$PROJECT_DIR/app.pid" echo -e "${GREEN}停止知识工具服务...${NC}" # 检查PID文件是否存在 if [ ! -f "$PID_FILE" ]; then echo -e "${YELLOW}未找到PID文件,服务可能未运行${NC}" exit 0 fi # 读取PID PID=$(cat "$PID_FILE") # 检查进程是否存在 if ! ps -p "$PID" > /dev/null 2>&1; then echo -e "${YELLOW}进程不存在,清理PID文件${NC}" rm -f "$PID_FILE" exit 0 fi # 停止进程 echo -e "${GREEN}正在停止进程 (PID: $PID)...${NC}" # 获取进程组ID PGID=$(ps -o pgid= -p "$PID" 2>/dev/null | tr -d ' ') # 尝试优雅停止整个进程组 if [ -n "$PGID" ]; then echo -e "${GREEN}停止进程组 (PGID: $PGID)...${NC}" kill -TERM -"$PGID" 2>/dev/null || kill -TERM "$PID" else kill -TERM "$PID" fi # 额外检查并停止可能的后台任务 echo -e "${GREEN}检查并停止相关后台任务...${NC}" # 查找可能的Python进程 PYTHON_PIDS=$(ps aux | grep -E "(python.*main\.py|uvicorn.*main)" | grep -v grep | awk '{print $2}') if [ -n "$PYTHON_PIDS" ]; then echo -e "${YELLOW}发现相关Python进程: $PYTHON_PIDS${NC}" for py_pid in $PYTHON_PIDS; do if [ "$py_pid" != "$PID" ]; then echo -e "${GREEN}停止Python进程: $py_pid${NC}" kill -TERM "$py_pid" 2>/dev/null || true fi done fi # 等待进程停止 for i in {1..15}; do if ! ps -p "$PID" > /dev/null 2>&1; then echo -e "${GREEN}服务已成功停止${NC}" rm -f "$PID_FILE" # 检查端口是否已释放 if command -v lsof >/dev/null 2>&1; then if ! lsof -i :8079 >/dev/null 2>&1; then echo -e "${GREEN}端口8079已释放${NC}" else echo -e "${YELLOW}警告: 端口8079仍被占用${NC}" fi fi exit 0 fi echo -e "${YELLOW}等待进程停止... ($i/15)${NC}" sleep 1 done # 如果优雅停止失败,强制停止整个进程组 echo -e "${YELLOW}优雅停止失败,强制停止进程组...${NC}" if [ -n "$PGID" ]; then kill -KILL -"$PGID" 2>/dev/null || kill -KILL "$PID" else kill -KILL "$PID" fi # 强制停止所有相关Python进程 PYTHON_PIDS=$(ps aux | grep -E "(python.*main\.py|uvicorn.*main)" | grep -v grep | awk '{print $2}') if [ -n "$PYTHON_PIDS" ]; then echo -e "${YELLOW}强制停止所有相关Python进程...${NC}" for py_pid in $PYTHON_PIDS; do echo -e "${YELLOW}强制停止Python进程: $py_pid${NC}" kill -KILL "$py_pid" 2>/dev/null || true done fi # 再次等待 sleep 3 if ! ps -p "$PID" > /dev/null 2>&1; then echo -e "${GREEN}服务已强制停止${NC}" rm -f "$PID_FILE" # 检查端口是否已释放 if command -v lsof >/dev/null 2>&1; then if ! lsof -i :8079 >/dev/null 2>&1; then echo -e "${GREEN}端口8079已释放${NC}" else echo -e "${YELLOW}警告: 端口8079仍被占用,可能需要手动处理${NC}" fi fi exit 0 else echo -e "${RED}无法停止服务,请手动处理${NC}" echo -e "${RED}可以尝试: kill -9 $PID${NC}" echo -e "${RED}或检查端口占用: lsof -i :8079${NC}" exit 1 fi