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