start_clip_api.sh 4.9 KB
#!/bin/bash

###############################################################################
# CN-CLIP REST API 启动脚本
#
# 用途:
#   启动 REST API 服务,提供 HTTP 接口供 curl 调用
#
# 使用方法:
#   ./scripts/start_clip_api.sh
#
###############################################################################

set -e

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

# 项目路径
PROJECT_ROOT="/data/tw/SearchEngine"
API_SCRIPT="${PROJECT_ROOT}/examples/clip_rest_api.py"
PID_FILE="${PROJECT_ROOT}/logs/clip_rest_api.pid"
LOG_FILE="${PROJECT_ROOT}/logs/clip_rest_api.log"

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}启动 CN-CLIP REST API 服务${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

# 检查 API 脚本
if [ ! -f "${API_SCRIPT}" ]; then
    echo -e "${RED}错误: API 脚本不存在: ${API_SCRIPT}${NC}"
    exit 1
fi

# 创建日志目录
mkdir -p "$(dirname "${LOG_FILE}")"

# 检查是否已有服务运行
if [ -f "${PID_FILE}" ]; then
    OLD_PID=$(cat "${PID_FILE}")
    if ps -p ${OLD_PID} > /dev/null 2>&1; then
        echo -e "${YELLOW}警告: REST API 服务已在运行 (PID: ${OLD_PID})${NC}"
        echo -e "${YELLOW}如需重启,请先运行: ./scripts/stop_clip_api.sh${NC}"
        exit 0
    else
        echo -e "${YELLOW}清理旧的 PID 文件${NC}"
        rm -f "${PID_FILE}"
    fi
fi

# 检查端口是否被占用
if lsof -Pi :6000 -sTCP:LISTEN -t >/dev/null 2>&1; then
    echo -e "${RED}错误: 端口 6000 已被占用${NC}"
    echo -e "${YELLOW}请检查是否有其他服务正在使用该端口${NC}"
    lsof -i :6000 | grep LISTEN || true
    exit 1
fi

# 检查 conda 环境
if [ -z "${CONDA_DEFAULT_ENV}" ] || [ "${CONDA_DEFAULT_ENV}" != "clip_service" ]; then
    echo -e "${YELLOW}激活 clip_service 环境...${NC}"
    if [ -f "/home/tw/miniconda3/etc/profile.d/conda.sh" ]; then
        source "/home/tw/miniconda3/etc/profile.d/conda.sh"
        conda activate clip_service
    else
        echo -e "${RED}错误: 无法找到 conda${NC}"
        exit 1
    fi
fi

# 检查依赖
echo -e "${BLUE}检查依赖...${NC}"
python -c "import flask" 2>/dev/null || {
    echo -e "${YELLOW}Flask 未安装,正在安装...${NC}"
    pip install flask flask-cors scikit-learn
}

# 检查 CN-CLIP 服务
echo -e "${BLUE}检查 CN-CLIP 服务...${NC}"
if ! ps aux | grep "clip_server" | grep -v grep > /dev/null; then
    echo -e "${YELLOW}警告: CN-CLIP 服务未运行${NC}"
    echo -e "${YELLOW}请先启动: ./scripts/start_cnclip_service.sh${NC}"
    read -p "$(echo -e ${YELLOW}是否继续启动 REST API? [y/N]: ${NC})" -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 0
    fi
fi

# 启动 REST API 服务
echo -e "${BLUE}正在启动 REST API 服务...${NC}"
cd "${PROJECT_ROOT}"

nohup python "${API_SCRIPT}" > "${LOG_FILE}" 2>&1 &
API_PID=$!
echo ${API_PID} > "${PID_FILE}"

# 等待服务启动
echo -e "${YELLOW}等待服务启动...${NC}"
sleep 3

# 检查服务是否启动成功
if ps -p ${API_PID} > /dev/null 2>&1; then
    # 检查端口是否监听
    if lsof -Pi :6000 -sTCP:LISTEN -t >/dev/null 2>&1; then
        echo -e "${GREEN}========================================${NC}"
        echo -e "${GREEN}✓ REST API 服务启动成功!${NC}"
        echo -e "${GREEN}========================================${NC}"
        echo ""
        echo -e "服务信息:"
        echo -e "  PID:          ${API_PID}"
        echo -e "  端口:         6000"
        echo -e "  日志文件:     ${LOG_FILE}"
        echo ""
        echo -e "测试服务:"
        echo -e "  curl http://localhost:6000/health"
        echo ""
        echo -e "使用示例:"
        echo -e "  # 编码文本"
        echo -e "  curl -X POST http://localhost:6000/encode/text \\"
        echo -e "    -H 'Content-Type: application/json' \\"
        echo -e "    -d '{\"texts\": [\"测试文本\"]}'"
        echo ""
        echo -e "  # 编码图像"
        echo -e "  curl -X POST http://localhost:6000/encode/image \\"
        echo -e "    -H 'Content-Type: application/json' \\"
        echo -e "    -d '{\"images\": [\"https://oss.essa.cn/98532128-cf8e-456c-9e30-6f2a5ea0c19f.jpg\"]}'"
        echo ""
        echo -e "查看日志:"
        echo -e "  tail -f ${LOG_FILE}"
        echo ""
        echo -e "停止服务:"
        echo -e "  ./scripts/stop_clip_api.sh"
        echo ""
    else
        echo -e "${YELLOW}服务已启动,但端口尚未监听,请稍候...${NC}"
        echo -e "${YELLOW}查看日志: tail -f ${LOG_FILE}${NC}"
    fi
else
    echo -e "${RED}========================================${NC}"
    echo -e "${RED}✗ 服务启动失败!${NC}"
    echo -e "${RED}========================================${NC}"
    echo ""
    echo -e "请查看日志获取详细错误信息:"
    echo -e "  tail -f ${LOG_FILE}"
    echo ""
    rm -f "${PID_FILE}"
    exit 1
fi