stop_cnclip_service.sh 3.29 KB
#!/bin/bash

###############################################################################
# CN-CLIP 服务停止脚本
#
# 用途:
#   停止由 start_cnclip_service.sh 启动的 CN-CLIP 服务
#
# 使用方法:
#   ./scripts/stop_cnclip_service.sh
#
###############################################################################

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 项目路径
PROJECT_ROOT="/data/tw/SearchEngine"
LOG_DIR="${PROJECT_ROOT}/logs"
PID_FILE="${LOG_DIR}/cnclip_service.pid"

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}停止 CN-CLIP 服务${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

# 检查 PID 文件是否存在
if [ ! -f "${PID_FILE}" ]; then
    echo -e "${YELLOW}警告: 未找到 PID 文件: ${PID_FILE}${NC}"
    echo -e "${YELLOW}CN-CLIP 服务可能未运行或不是通过此脚本启动的${NC}"
    echo ""

    # 尝试查找并终止相关进程
    echo -e "${YELLOW}尝试查找运行中的 CN-CLIP 进程...${NC}"
    CLIP_PIDS=$(ps aux | grep "clip_server" | grep -v grep | awk '{print $2}')

    if [ -z "${CLIP_PIDS}" ]; then
        echo -e "${GREEN}✓ 未发现运行中的 CN-CLIP 进程${NC}"
        exit 0
    else
        echo -e "${YELLOW}发现以下 CN-CLIP 进程:${NC}"
        ps aux | grep "clip_server" | grep -v grep
        echo ""
        echo -e "${YELLOW}正在终止这些进程...${NC}"
        for PID in ${CLIP_PIDS}; do
            echo -e "${YELLOW}终止进程 ${PID}...${NC}"
            kill ${PID} 2>/dev/null || true
            sleep 1

            if ps -p ${PID} > /dev/null 2>&1; then
                echo -e "${YELLOW}进程 ${PID} 仍在运行,强制终止...${NC}"
                kill -9 ${PID} 2>/dev/null || true
            fi
        done
        echo -e "${GREEN}✓ 所有进程已终止${NC}"
        exit 0
    fi
fi

# 读取 PID
PID="$(cat "${PID_FILE}")"

# 检查 PID 是否为空
if [ -z "${PID}" ]; then
    echo -e "${YELLOW}警告: PID 文件存在但为空${NC}"
    rm -f "${PID_FILE}"
    exit 0
fi

# 检查进程是否存在
if ! ps -p "${PID}" > /dev/null 2>&1; then
    echo -e "${YELLOW}警告: 进程 ${PID} 不存在${NC}"
    echo -e "${YELLOW}清理 PID 文件...${NC}"
    rm -f "${PID_FILE}"
    exit 0
fi

# 停止服务
echo -e "${BLUE}服务信息:${NC}"
echo "  PID:       ${PID}"
echo "  PID 文件:  ${PID_FILE}"
echo ""

echo -e "${YELLOW}正在停止服务...${NC}"

# 发送 SIGTERM 信号
kill "${PID}" || true
sleep 2

# 检查进程是否还在运行
if ps -p "${PID}" > /dev/null 2>&1; then
    echo -e "${YELLOW}进程仍在运行,发送 SIGKILL...${NC}"
    kill -9 "${PID}" || true
    sleep 1
fi

# 最终检查
if ps -p "${PID}" > /dev/null 2>&1; then
    echo -e "${RED}错误: 无法停止进程 ${PID}${NC}"
    echo -e "${YELLOW}请手动停止: kill -9 ${PID}${NC}"
    exit 1
else
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}✓ CN-CLIP 服务已停止${NC}"
    echo -e "${GREEN}========================================${NC}"
    echo ""
    rm -f "${PID_FILE}"
    echo -e "PID 文件已删除: ${PID_FILE}"
    echo ""
    echo -e "如需重新启动服务:"
    echo -e "  ./scripts/start_cnclip_service.sh"
    echo ""
fi