Просмотр исходного кода

feat: 添加独立的推理服务和业务 API 启动脚本

Co-authored-by: Cursor <cursoragent@cursor.com>
何文松 2 недель назад
Родитель
Сommit
fc1eee41c5
2 измененных файлов с 139 добавлено и 0 удалено
  1. 77 0
      start_api.sh
  2. 62 0
      start_inference.sh

+ 77 - 0
start_api.sh

@@ -0,0 +1,77 @@
+#!/bin/bash
+# MinerU 业务 API 启动脚本
+
+# 1. 环境配置
+export MINERU_OPENAI_PORT=30000
+export MINERU_API_PORT=5282
+export MINERU_VL_SERVER="http://127.0.0.1:${MINERU_OPENAI_PORT}/v1"
+
+# 日志配置
+LOG_DIR="/var/log/minerU"
+LOG_FILE="${LOG_DIR}/mineru-api.log"
+
+echo "=========================================="
+echo "🚀 正在启动 MinerU 业务 API 服务..."
+echo "📍 端口: ${MINERU_API_PORT}"
+echo "🔗 后端: ${MINERU_VL_SERVER}"
+echo "📂 日志: ${LOG_FILE}"
+echo "=========================================="
+
+# 确保日志目录存在
+mkdir -p "${LOG_DIR}"
+
+# 2. 检查并清理端口占用
+python3 -c "
+import os, glob
+def cleanup(port):
+    port_hex = f'{port:04X}'
+    inodes = set()
+    for net_file in ['/proc/net/tcp', '/proc/net/tcp6']:
+        if os.path.exists(net_file):
+            with open(net_file, 'r') as f:
+                for line in f:
+                    parts = line.split()
+                    if len(parts) > 1 and parts[1].endswith(':' + port_hex): inodes.add(parts[9])
+    if not inodes: return
+    for fd_dir in glob.glob('/proc/[0-9]*/fd'):
+        try:
+            for fd in os.listdir(fd_dir):
+                try:
+                    link = os.readlink(os.path.join(fd_dir, fd))
+                    for inode in inodes:
+                        if f'socket:[{inode}]' in link:
+                            pid = fd_dir.split('/')[2]
+                            if int(pid) != os.getpid():
+                                print(f'   ⚠️  清理占用端口 {port} 的进程 {pid}...')
+                                os.kill(int(pid), 9)
+                except: continue
+        except: continue
+cleanup(${MINERU_API_PORT})
+"
+
+# 3. 等待推理服务就绪
+echo "⏳ 正在等待推理服务 (端口 ${MINERU_OPENAI_PORT}) 就绪..."
+MAX_RETRIES=100
+COUNT=0
+while ! python3 -c "import socket; s=socket.socket(); s.settimeout(1); exit(s.connect_ex(('127.0.0.1', ${MINERU_OPENAI_PORT})))" 2>/dev/null; do
+    sleep 3
+    COUNT=$((COUNT + 1))
+    if [ $COUNT -ge $MAX_RETRIES ]; then
+        echo "❌ 错误: 推理服务超时未就绪,放弃启动 API。"
+        exit 1
+    fi
+    echo "   等待中 ($((COUNT * 3))s)..."
+done
+echo "✅ 推理服务已就绪!"
+
+# 4. 启动服务 (使用 nohup 确保后台运行)
+echo "--- 启动于 $(date) ---" > "${LOG_FILE}"
+nohup mineru-api --host 0.0.0.0 --port ${MINERU_API_PORT} >> "${LOG_FILE}" 2>&1 &
+
+# 分离进程
+disown
+
+echo "=========================================="
+echo "✅ API 服务已在后台启动!"
+echo "📄 查看日志: tail -f ${LOG_FILE}"
+echo "=========================================="

+ 62 - 0
start_inference.sh

@@ -0,0 +1,62 @@
+#!/bin/bash
+# MinerU 推理服务启动脚本 (vLLM)
+
+# 1. 环境配置
+export MINERU_LMDEPLOY_DEVICE=ascend
+export MINERU_MODEL_SOURCE=modelscope
+export VLLM_WORKER_MULTIPROC_METHOD=spawn
+export MINERU_OPENAI_PORT=30000
+
+# 日志配置
+LOG_DIR="/var/log/minerU"
+LOG_FILE="${LOG_DIR}/mineru-openai.log"
+
+echo "=========================================="
+echo "🚀 正在启动 MinerU 推理服务 (vLLM)..."
+echo "📍 端口: ${MINERU_OPENAI_PORT}"
+echo "📂 日志: ${LOG_FILE}"
+echo "=========================================="
+
+# 确保日志目录存在
+mkdir -p "${LOG_DIR}"
+
+# 2. 检查并清理端口占用
+python3 -c "
+import os, glob
+def cleanup(port):
+    port_hex = f'{port:04X}'
+    inodes = set()
+    for net_file in ['/proc/net/tcp', '/proc/net/tcp6']:
+        if os.path.exists(net_file):
+            with open(net_file, 'r') as f:
+                for line in f:
+                    parts = line.split()
+                    if len(parts) > 1 and parts[1].endswith(':' + port_hex): inodes.add(parts[9])
+    if not inodes: return
+    for fd_dir in glob.glob('/proc/[0-9]*/fd'):
+        try:
+            for fd in os.listdir(fd_dir):
+                try:
+                    link = os.readlink(os.path.join(fd_dir, fd))
+                    for inode in inodes:
+                        if f'socket:[{inode}]' in link:
+                            pid = fd_dir.split('/')[2]
+                            if int(pid) != os.getpid():
+                                print(f'   ⚠️  清理占用端口 {port} 的进程 {pid}...')
+                                os.kill(int(pid), 9)
+                except: continue
+        except: continue
+cleanup(${MINERU_OPENAI_PORT})
+"
+
+# 3. 启动服务 (使用 nohup 确保后台运行)
+echo "--- 启动于 $(date) ---" > "${LOG_FILE}"
+nohup mineru-openai-server >> "${LOG_FILE}" 2>&1 &
+
+# 分离进程,防止终端退出影响服务
+disown
+
+echo "=========================================="
+echo "✅ 推理服务已在后台启动!"
+echo "📄 查看日志: tail -f ${LOG_FILE}"
+echo "=========================================="