#!/bin/bash # PaddleX PP-StructureV3 服务守护进程脚本 LOGDIR="/home/ubuntu/zhch/logs" mkdir -p $LOGDIR PIDFILE="$LOGDIR/ppstructurev3.pid" LOGFILE="$LOGDIR/ppstructurev3.log" # 配置参数 CONDA_ENV="paddle" # 根据您的study-notes.md中的环境名 PORT="8111" CUDA_VISIBLE_DEVICES=7 SCRIPT_DIR="/home/ubuntu/zhch/PaddleX/zhch" # PIPELINE_CONFIG="$SCRIPT_DIR/my_config/PP-StructureV3.yaml" PIPELINE_CONFIG="$SCRIPT_DIR/my_config/PP-StructureV3-RT-DETR-H_layout_17cls.yaml" # 正确初始化和激活conda环境 # 方法1:使用conda.sh脚本初始化 if [ -f "/home/ubuntu/anaconda3/etc/profile.d/conda.sh" ]; then source /home/ubuntu/anaconda3/etc/profile.d/conda.sh conda activate $CONDA_ENV elif [ -f "/opt/conda/etc/profile.d/conda.sh" ]; then source /opt/conda/etc/profile.d/conda.sh conda activate $CONDA_ENV else # 方法2:直接使用conda可执行文件路径 echo "Warning: Using direct conda path activation" export PATH="/home/ubuntu/anaconda3/envs/$CONDA_ENV/bin:$PATH" fi # 设置模型下载源(可选) export PADDLE_PDX_MODEL_SOURCE="bos" export PADDLEX_ENABLE_TABLE_ADAPTER="true" export PYTHONWARNINGS="ignore::UserWarning" start() { if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE) 2>/dev/null; then echo "PaddleX PP-StructureV3 is already running" return 1 fi echo "Starting PaddleX PP-StructureV3 daemon..." echo "Port: $PORT, Device: $DEVICE" echo "Pipeline config: $PIPELINE_CONFIG" # 检查配置文件是否存在 if [ ! -f "$PIPELINE_CONFIG" ]; then echo "❌ Pipeline config file not found: $PIPELINE_CONFIG" return 1 fi # 检查conda环境 if ! command -v python >/dev/null 2>&1; then echo "❌ Python not found. Check conda environment activation." return 1 fi # 检查paddlex命令 if ! command -v paddlex >/dev/null 2>&1; then echo "❌ PaddleX not found. Check installation and environment." return 1 fi echo "🔧 Using Python: $(which python)" echo "🔧 Using PaddleX: $(which paddlex)" echo " CUDA Devices: $CUDA_VISIBLE_DEVICES" # 启动PaddleX服务 cd $SCRIPT_DIR || exit 1 nohup $CUDA_VISIBLE_DEVICES; python3 start_paddlex_with_adapter.py --serve \ --port $PORT \ --device "gpu" \ --pipeline "$PIPELINE_CONFIG" \ > $LOGFILE 2>&1 & echo $! > $PIDFILE echo "✅ PaddleX PP-StructureV3 started with PID: $(cat $PIDFILE)" echo "📋 Log file: $LOGFILE" echo "🌐 Service URL: http://localhost:$PORT" echo "📖 API Documentation: http://localhost:$PORT/docs" } stop() { if [ ! -f $PIDFILE ]; then echo "PaddleX PP-StructureV3 is not running" return 1 fi PID=$(cat $PIDFILE) echo "Stopping PaddleX PP-StructureV3 (PID: $PID)..." # 优雅停止 kill $PID # 等待进程结束 for i in {1..10}; do if ! kill -0 $PID 2>/dev/null; then break fi echo "Waiting for process to stop... ($i/10)" sleep 1 done # 如果进程仍在运行,强制结束 if kill -0 $PID 2>/dev/null; then echo "Force killing process..." kill -9 $PID fi rm -f $PIDFILE echo "✅ PaddleX PP-StructureV3 stopped" } status() { if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE) 2>/dev/null; then PID=$(cat $PIDFILE) echo "✅ PaddleX PP-StructureV3 is running (PID: $PID)" echo "🌐 Service URL: http://localhost:$PORT" echo "📋 Log file: $LOGFILE" # 检查端口是否被监听 if command -v netstat >/dev/null 2>&1; then if netstat -tuln | grep -q ":$PORT "; then echo "🔗 Port $PORT is being listened" else echo "⚠️ Port $PORT is not being listened (service may be starting up)" fi fi # 显示最新日志 if [ -f $LOGFILE ]; then echo "📄 Latest logs (last 5 lines):" tail -5 $LOGFILE fi else echo "❌ PaddleX PP-StructureV3 is not running" if [ -f $PIDFILE ]; then echo "Removing stale PID file..." rm -f $PIDFILE fi fi } logs() { if [ -f $LOGFILE ]; then echo "📄 PaddleX PP-StructureV3 logs:" echo "==================" tail -f $LOGFILE else echo "❌ Log file not found: $LOGFILE" fi } config() { echo "📋 Current configuration:" echo " Conda Environment: $CONDA_ENV" echo " Port: $PORT" echo " Device: $DEVICE" echo " Pipeline Config: $PIPELINE_CONFIG" echo " Model Source: ${PADDLE_PDX_MODEL_SOURCE:-default}" echo " PID File: $PIDFILE" echo " Log File: $LOGFILE" if [ -f "$PIPELINE_CONFIG" ]; then echo "✅ Pipeline config file exists" else echo "❌ Pipeline config file not found" fi # 显示环境信息 echo "" echo "🔧 Environment:" echo " Python: $(which python 2>/dev/null || echo 'Not found')" echo " PaddleX: $(which paddlex 2>/dev/null || echo 'Not found')" echo " Conda: $(which conda 2>/dev/null || echo 'Not found')" } # 显示使用帮助 usage() { echo "PaddleX PP-StructureV3 Service Daemon" echo "======================================" echo "Usage: $0 {start|stop|restart|status|logs|config}" echo "" echo "Commands:" echo " start - Start the PaddleX service" echo " stop - Stop the PaddleX service" echo " restart - Restart the PaddleX service" echo " status - Show service status" echo " logs - Show service logs (follow mode)" echo " config - Show current configuration" echo "" echo "Configuration (edit script to modify):" echo " Port: $PORT" echo " Device: $DEVICE" echo " Pipeline: $PIPELINE_CONFIG" echo "" echo "Examples:" echo " ./ppstructure_v3_daemon.sh start" echo " ./ppstructure_v3_daemon.sh status" echo " ./ppstructure_v3_daemon.sh logs" } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 3 start ;; status) status ;; logs) logs ;; config) config ;; *) usage exit 1 ;; esac