Ragflow源码:launch_backend_service.sh

流程图

并行执行 任务执行器0 启动任务执行器 任务执行器1 ... 任务执行器N RAGFlow服务器 启动RAGFlow服务器 开始脚本 加载环境变量 取消HTTP代理设置 设置Python路径和库 设置默认工作进程数 定义清理函数 等待进程结束 退出时清理

代码解释

bash 复制代码
#!/bin/bash

# 如果任何命令返回非零状态(失败),立即退出脚本
set -e

# 函数:从.env文件加载环境变量
load_env_file() {
    # 获取当前脚本所在的目录路径
    local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
    local env_file="$script_dir/.env"

    # 检查.env文件是否存在
    if [ -f "$env_file" ]; then
        echo "从以下位置加载环境变量: $env_file"
        # 设置所有变量为环境变量
        set -a
        source "$env_file" 
        set +a
    else
        echo "警告: 未找到.env文件: $env_file"
    fi
}

# 加载环境变量
load_env_file

# 取消可能由Docker守护进程设置的HTTP代理
export http_proxy=""; export https_proxy=""; export no_proxy=""; export HTTP_PROXY=""; export HTTPS_PROXY=""; export NO_PROXY=""
# 设置Python模块搜索路径
export PYTHONPATH=$(pwd)

# 设置动态链接库路径
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/
# 获取jemalloc库的路径
JEMALLOC_PATH=$(pkg-config --variable=libdir jemalloc)/libjemalloc.so

# 设置Python解释器
PY=python3

# 如果未设置WS变量或WS小于1,则设置默认工作进程数为1
if [[ -z "$WS" || $WS -lt 1 ]]; then
  WS=1
fi

# 每个任务执行器和服务器的最大重试次数
MAX_RETRIES=5

# 控制终止的标志
STOP=false

# 存储子进程PID的数组
PIDS=()

# 设置NLTK数据目录路径
export NLTK_DATA="./nltk_data"

# 清理函数:处理终止信号
cleanup() {
  echo "接收到终止信号。正在关闭..."
  STOP=true
  # 终止所有子进程
  for pid in "${PIDS[@]}"; do
    if kill -0 "$pid" 2>/dev/null; then
      echo "正在终止进程 $pid"
      kill "$pid"
    fi
  done
  exit 0
}

# 捕获SIGINT和SIGTERM信号,调用cleanup函数
trap cleanup SIGINT SIGTERM

# 函数:使用重试逻辑执行task_executor.py
task_exe(){
    local task_id=$1
    local retry_count=0
    while ! $STOP && [ $retry_count -lt $MAX_RETRIES ]; do
        echo "为任务 $task_id 启动task_executor.py (尝试 $((retry_count+1)))"
        # 使用jemalloc预加载执行Python脚本
        LD_PRELOAD=$JEMALLOC_PATH $PY rag/svr/task_executor.py "$task_id"
        EXIT_CODE=$?
        if [ $EXIT_CODE -eq 0 ]; then
            echo "任务 $task_id 的task_executor.py成功退出。"
            break
        else
            echo "任务 $task_id 的task_executor.py失败,退出代码 $EXIT_CODE。正在重试..." >&2
            retry_count=$((retry_count + 1))
            sleep 2
        fi
    done

    if [ $retry_count -ge $MAX_RETRIES ]; then
        echo "任务 $task_id 的task_executor.py在 $MAX_RETRIES 次尝试后失败。正在退出..." >&2
        cleanup
    fi
}

# 函数:使用重试逻辑执行ragflow_server.py
run_server(){
    local retry_count=0
    while ! $STOP && [ $retry_count -lt $MAX_RETRIES ]; do
        echo "启动ragflow_server.py (尝试 $((retry_count+1)))"
        $PY api/ragflow_server.py
        EXIT_CODE=$?
        if [ $EXIT_CODE -eq 0 ]; then
            echo "ragflow_server.py成功退出。"
            break
        else
            echo "ragflow_server.py失败,退出代码 $EXIT_CODE。正在重试..." >&2
            retry_count=$((retry_count + 1))
            sleep 2
        fi
    done

    if [ $retry_count -ge $MAX_RETRIES ]; then
        echo "ragflow_server.py在 $MAX_RETRIES 次尝试后失败。正在退出..." >&2
        cleanup
    fi
}

# 启动任务执行器进程
for ((i=0;i<WS;i++))
do
  task_exe "$i" &
  PIDS+=($!)
done

# 启动主服务器进程
run_server &
PIDS+=($!)

# 等待所有后台进程完成
wait
相关推荐
cuguanren12 分钟前
MuleRun vs OpenClaw vs 网页服务:云端安全与本地自由的取舍之道
安全·大模型·llm·agent·智能体·openclaw·mulerun
马克Markorg28 分钟前
OpenClaw架构学习与思考
大模型·agent·openclaw·小龙虾
星始流年2 小时前
AI Agent 开发系列 之 01 🔎重新认识 LLM
人工智能·llm·agent
熊猫钓鱼>_>3 小时前
AI语料投毒与信息证伪:当生成式引擎成为攻击向量
人工智能·ai·agent·geo·skills·agent skills·openclaw
HIT_Weston3 小时前
18、【Agent】【OpenCode】源码构建(Bun&node速度对比)
人工智能·agent·opencode
HIT_Weston4 小时前
17、【Agent】【OpenCode】源码构建(Bun安装方式)
人工智能·agent·opencode
阿里云云原生4 小时前
突破 Serverless 无状态限制:用 AgentRun 破解 Agent 沙箱工程化挑战
agent
阿里云云原生4 小时前
什么?我的狼人杀水平还不如 AI ?
agent
deephub4 小时前
构建生产级 AI Agent 系统的4大主流技术:反思、工具、规划与多智能体协作
人工智能·python·深度学习·大语言模型·agent
gracefullight5 小时前
oh-my-agent — 面向实战的多 AI IDE 智能体调控框架
agent