#!/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/saas-search" 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}" # 查找所有相关的 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