123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #!/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
|