stop_cnclip_service.sh 4.12 KB
#!/bin/bash

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

set -euo pipefail

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

# 项目路径
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
LOG_DIR="${PROJECT_ROOT}/logs"
PID_FILE="${LOG_DIR}/cnclip.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}"

# 查找所有相关的 clip_server 进程(通过配置文件路径)
CONFIG_FILE="torch-flow-temp.yml"
ALL_PIDS=$(ps aux | grep "clip_server.*${CONFIG_FILE}" | grep -v grep | awk '{print $2}')

if [ -z "${ALL_PIDS}" ]; then
    # 如果没有找到,至少尝试停止 PID 文件中的进程
    ALL_PIDS="${PID}"
fi

# 终止所有相关进程
for P in ${ALL_PIDS}; do
    if ps -p "${P}" > /dev/null 2>&1; then
        echo -e "${YELLOW}终止进程 ${P}...${NC}"
        kill "${P}" 2>/dev/null || true
    fi
done

# 等待进程退出
sleep 3

# 检查是否还有进程在运行,如果有则强制终止
REMAINING_PIDS=$(ps aux | grep "clip_server.*${CONFIG_FILE}" | grep -v grep | awk '{print $2}')
if [ -n "${REMAINING_PIDS}" ]; then
    echo -e "${YELLOW}发现仍在运行的进程,强制终止...${NC}"
    for P in ${REMAINING_PIDS}; do
        echo -e "${YELLOW}强制终止进程 ${P}...${NC}"
        kill -9 "${P}" 2>/dev/null || true
    done
    sleep 1
fi

# 最终检查
FINAL_CHECK=$(ps aux | grep "clip_server.*${CONFIG_FILE}" | grep -v grep | wc -l)
if [ "${FINAL_CHECK}" -gt 0 ]; then
    echo -e "${RED}错误: 仍有进程无法停止${NC}"
    echo -e "${YELLOW}请手动检查: ps aux | grep clip_server${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