From 7228b586c8ca8c8490a57509d8e8f3657db36f03 Mon Sep 17 00:00:00 2001 From: potaser Date: Mon, 10 Aug 2026 10:57:49 +0800 Subject: [PATCH] fix(runtime): standardize 9000 startup and isolate project services --- manage_plantai.sh | 77 ++++++++++++++----- .../legacy_startup/restart_with_prompts.sh | 0 .../legacy_startup/start-webui.sh | 0 .../legacy_startup/start_celery.sh | 0 .../legacy_startup/start_celery_7880.sh | 0 .../legacy_startup/start_celery_port9000.sh | 0 start_celery_9000.sh | 8 +- start_plantai_9000.sh | 21 ++--- 8 files changed, 73 insertions(+), 33 deletions(-) rename restart_with_prompts.sh => scripts/legacy_startup/restart_with_prompts.sh (100%) rename start-webui.sh => scripts/legacy_startup/start-webui.sh (100%) rename start_celery.sh => scripts/legacy_startup/start_celery.sh (100%) rename start_celery_7880.sh => scripts/legacy_startup/start_celery_7880.sh (100%) rename start_celery_port9000.sh => scripts/legacy_startup/start_celery_port9000.sh (100%) diff --git a/manage_plantai.sh b/manage_plantai.sh index 52b893ae5..c14e1c8dd 100755 --- a/manage_plantai.sh +++ b/manage_plantai.sh @@ -2,15 +2,19 @@ # PlantAI-dev 9000 服务管理脚本 # 用法: bash manage_plantai.sh {start|stop|restart|status} [--port PORT] # 默认端口: 9000 -# -# 项目: /home/xzq/5090/teamWorkspace/zh/PlantAI-dev -# 端口: 9000 (web), Redis DB 14 (queue prefix: plantai_dev_9002) set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +if [ -f "$SCRIPT_DIR/.env" ]; then + set -a + . "$SCRIPT_DIR/.env" + set +a +fi + # 解析命令行参数:第一个参数是命令,后面可选 --port / -p CMD="" -WEB_PORT="9000" +WEB_PORT="${PLANTAI_WEB_PORT:-9000}" for arg in "$@"; do case "$arg" in start|stop|restart|status) @@ -33,12 +37,15 @@ done CMD="${CMD:-status}" # Conda 环境:启动脚本内部也依赖这个环境 -CONDA_ENV="${CONDA_ENV:-/home/xzq/miniconda3/envs/test4py311}" +CONDA_BASE="${BBAV5_CONDA_BASE:-/home/xia-lab/miniconda3}" +DEFAULT_ENV="${BBAV5_DEFAULT_ENV:-test4py311}" +CONDA_ENV="${CONDA_ENV:-$CONDA_BASE/envs/$DEFAULT_ENV}" export PATH="$CONDA_ENV/bin:$PATH" # 项目配置(与 .env 和启动脚本保持一致) -PROJECT_DIR="/home/xzq/5090/teamWorkspace/zh/PlantAI-dev" -QUEUE_PREFIX="plantai_dev_9002" +PROJECT_DIR="$SCRIPT_DIR" +QUEUE_PREFIX="${BBAV5_QUEUE_PREFIX:-plantai_4090_9000}" +REDIS_URL="${BBAV5_REDIS_URL:-redis://localhost:6379/10}" WEB_LOG="/tmp/plantai_${WEB_PORT}.log" CELERY_LOG="/tmp/celery_${WEB_PORT}.log" @@ -46,28 +53,49 @@ red() { echo -e "\033[31m$*\033[0m"; } green(){ echo -e "\033[32m$*\033[0m"; } cyan() { echo -e "\033[36m$*\033[0m"; } +web_pid_for_port() { + ss -tlnp 2>/dev/null \ + | grep ":$WEB_PORT " \ + | grep -oP 'pid=\K\d+' \ + | head -n 1 \ + || true +} + +web_process_cwd() { + readlink -f "/proc/$1/cwd" 2>/dev/null || true +} + +web_pid_belongs_to_project() { + [ "$(web_process_cwd "$1")" = "$PROJECT_DIR" ] +} + status() { echo "" cyan "=== PlantAI-dev ${WEB_PORT} 服务状态 ===" echo "" # Web 服务 - WEB_PID=$(ss -tlnp 2>/dev/null | grep ":$WEB_PORT " | grep -oP 'pid=\K\d+' || true) + WEB_PID="$(web_pid_for_port)" if [ -n "${WEB_PID:-}" ]; then - green "[✓] Web 服务运行中 (端口 $WEB_PORT, PID $WEB_PID)" + WEB_CWD="$(web_process_cwd "$WEB_PID")" + if web_pid_belongs_to_project "$WEB_PID"; then + green "[✓] Web 服务运行中 (端口 $WEB_PORT, PID $WEB_PID)" + else + red "[!] 端口 $WEB_PORT 被其他项目占用 (PID $WEB_PID, cwd ${WEB_CWD:-未知})" + fi else red "[✗] Web 服务未启动 (端口 $WEB_PORT)" fi # Redis - if redis-cli ping > /dev/null 2>&1; then - green "[✓] Redis 运行中 (localhost:6379)" + if redis-cli -u "$REDIS_URL" ping > /dev/null 2>&1; then + green "[✓] Redis 运行中 ($REDIS_URL)" else red "[✗] Redis 未启动" fi # Celery workers - CELERY_COUNT=$(pgrep -fc "$QUEUE_PREFIX" || echo 0) + CELERY_COUNT="$(pgrep -fc "$QUEUE_PREFIX" || true)" if [ "$CELERY_COUNT" -gt 0 ]; then green "[✓] Celery workers 运行中 (${CELERY_COUNT} 进程, 队列前缀: $QUEUE_PREFIX)" echo " Worker 列表:" @@ -86,13 +114,18 @@ stop() { echo "" # 停止 Web 服务 - WEB_PID=$(ss -tlnp 2>/dev/null | grep ":$WEB_PORT " | grep -oP 'pid=\K\d+' || true) + WEB_PID="$(web_pid_for_port)" if [ -n "${WEB_PID:-}" ]; then + WEB_CWD="$(web_process_cwd "$WEB_PID")" + if ! web_pid_belongs_to_project "$WEB_PID"; then + red "[!] 拒绝停止:端口 $WEB_PORT 属于其他项目 (PID $WEB_PID, cwd ${WEB_CWD:-未知})" + return 1 + fi echo "正在停止 Web 服务 (PID $WEB_PID)..." kill "$WEB_PID" 2>/dev/null || true sleep 1 - # 如果还没死,强制 kill - if ss -tlnp 2>/dev/null | grep -q ":$WEB_PORT"; then + # 仅强制停止仍属于本项目的原进程,避免 PID 复用造成误杀。 + if kill -0 "$WEB_PID" 2>/dev/null && web_pid_belongs_to_project "$WEB_PID"; then kill -9 "$WEB_PID" 2>/dev/null || true fi green "[✓] Web 服务已停止" @@ -125,12 +158,18 @@ start() { echo "" # 检查是否已在运行 - if ss -tlnp 2>/dev/null | grep -q ":$WEB_PORT"; then - red "[!] 端口 $WEB_PORT 已被占用,请先停止服务" + WEB_PID="$(web_pid_for_port)" + if [ -n "${WEB_PID:-}" ]; then + WEB_CWD="$(web_process_cwd "$WEB_PID")" + if web_pid_belongs_to_project "$WEB_PID"; then + red "[!] 本项目 Web 已在端口 $WEB_PORT 运行 (PID $WEB_PID)" + else + red "[!] 端口 $WEB_PORT 被其他项目占用 (PID $WEB_PID, cwd ${WEB_CWD:-未知})" + fi exit 1 fi - if ! redis-cli ping > /dev/null 2>&1; then + if ! redis-cli -u "$REDIS_URL" ping > /dev/null 2>&1; then red "[!] Redis 未运行,请先启动 Redis" exit 1 fi @@ -141,7 +180,7 @@ start() { echo "正在启动 Celery workers..." nohup bash start_celery_9000.sh > "$CELERY_LOG" 2>&1 & sleep 3 - CELERY_COUNT=$(pgrep -fc "$QUEUE_PREFIX" || echo 0) + CELERY_COUNT="$(pgrep -fc "$QUEUE_PREFIX" || true)" if [ "$CELERY_COUNT" -gt 0 ]; then green " [✓] Celery workers 已启动 (${CELERY_COUNT} 进程)" else diff --git a/restart_with_prompts.sh b/scripts/legacy_startup/restart_with_prompts.sh similarity index 100% rename from restart_with_prompts.sh rename to scripts/legacy_startup/restart_with_prompts.sh diff --git a/start-webui.sh b/scripts/legacy_startup/start-webui.sh similarity index 100% rename from start-webui.sh rename to scripts/legacy_startup/start-webui.sh diff --git a/start_celery.sh b/scripts/legacy_startup/start_celery.sh similarity index 100% rename from start_celery.sh rename to scripts/legacy_startup/start_celery.sh diff --git a/start_celery_7880.sh b/scripts/legacy_startup/start_celery_7880.sh similarity index 100% rename from start_celery_7880.sh rename to scripts/legacy_startup/start_celery_7880.sh diff --git a/start_celery_port9000.sh b/scripts/legacy_startup/start_celery_port9000.sh similarity index 100% rename from start_celery_port9000.sh rename to scripts/legacy_startup/start_celery_port9000.sh diff --git a/start_celery_9000.sh b/start_celery_9000.sh index 2496254f8..2c341bbff 100755 --- a/start_celery_9000.sh +++ b/start_celery_9000.sh @@ -26,13 +26,13 @@ if [ -n "$EXTERNAL_BBAV5_WORKER_NAME_PREFIX" ]; then BBAV5_WORKER_NAME_PREFIX="$EXTERNAL_BBAV5_WORKER_NAME_PREFIX" fi if [ -z "${BBAV5_QUEUE_PREFIX-}" ]; then - BBAV5_QUEUE_PREFIX="plantai_dev_9000" + BBAV5_QUEUE_PREFIX="plantai_4090_9000" fi if [ -z "${BBAV5_REDIS_URL-}" ]; then BBAV5_REDIS_URL="redis://localhost:6379/10" fi if [ -z "${BBAV5_CELERY_LOG_DIR-}" ]; then - BBAV5_CELERY_LOG_DIR="logs/celery_plantai_dev_9000" + BBAV5_CELERY_LOG_DIR="logs/celery_plantai_4090_9000" fi if [ -z "$EXTERNAL_BBAV5_WORKER_NAME_PREFIX" ]; then unset BBAV5_WORKER_NAME_PREFIX @@ -51,11 +51,11 @@ export BBAV5_PROJECT_ENV_FILE="${BBAV5_PROJECT_ENV_FILE:-$PROJECT_ROOT/.env}" export BBAV5_LIGHTWEIGHT_EXTENSION_STORE="${BBAV5_LIGHTWEIGHT_EXTENSION_STORE:-$PROJECT_ROOT/.runtime/lightweight-extension/store}" export BBAV5_LIGHTWEIGHT_INPUT="${BBAV5_LIGHTWEIGHT_INPUT:-$PROJECT_ROOT/input}" export BBAV5_LIGHTWEIGHT_WORKSPACE="${BBAV5_LIGHTWEIGHT_WORKSPACE:-$PROJECT_ROOT/workspace}" -export BBAV5_QUEUE_PREFIX="${BBAV5_QUEUE_PREFIX:-plantai_dev_9000}" +export BBAV5_QUEUE_PREFIX="${BBAV5_QUEUE_PREFIX:-plantai_4090_9000}" export BBAV5_REDIS_URL="${BBAV5_REDIS_URL:-redis://localhost:6379/10}" WORKER_NAME_PREFIX="${BBAV5_WORKER_NAME_PREFIX:-${BBAV5_QUEUE_PREFIX//[^A-Za-z0-9_]/_}}" -LOG_DIR="${BBAV5_CELERY_LOG_DIR:-logs/celery_plantai_dev_9000}" +LOG_DIR="${BBAV5_CELERY_LOG_DIR:-logs/celery_plantai_4090_9000}" mkdir -p "$LOG_DIR" CELERY="$CONDA_ENV/bin/celery" diff --git a/start_plantai_9000.sh b/start_plantai_9000.sh index 93050a096..7ad851daf 100755 --- a/start_plantai_9000.sh +++ b/start_plantai_9000.sh @@ -24,6 +24,12 @@ done SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" +if [ -f "$SCRIPT_DIR/.env" ]; then + set -a + . "$SCRIPT_DIR/.env" + set +a +fi + CONDA_BASE="${BBAV5_CONDA_BASE:-/home/xia-lab/miniconda3}" DEFAULT_ENV="${BBAV5_DEFAULT_ENV:-test4py311}" CONDA_ENV="$CONDA_BASE/envs/$DEFAULT_ENV" @@ -33,23 +39,18 @@ export PATH="$CONDA_ENV/bin:$PATH" # the caller's shell; GWAS/other sandboxes have dedicated restart scripts. export BBAV5_PROJECT_ROOT="$SCRIPT_DIR" export PLANTAI_PROJECT_ROOT="$SCRIPT_DIR" -if [ -f "$SCRIPT_DIR/.env" ]; then - set -a - . "$SCRIPT_DIR/.env" - set +a -fi export BBAV5_PROJECT_ENV_FILE="${BBAV5_PROJECT_ENV_FILE:-$SCRIPT_DIR/.env}" export BBAV5_LIGHTWEIGHT_EXTENSION_STORE="${BBAV5_LIGHTWEIGHT_EXTENSION_STORE:-$SCRIPT_DIR/.runtime/lightweight-extension/store}" export BBAV5_LIGHTWEIGHT_INPUT="${BBAV5_LIGHTWEIGHT_INPUT:-$SCRIPT_DIR/input}" export BBAV5_LIGHTWEIGHT_WORKSPACE="${BBAV5_LIGHTWEIGHT_WORKSPACE:-$SCRIPT_DIR/workspace}" -export BBAV5_QUEUE_PREFIX="${BBAV5_QUEUE_PREFIX:-plantai_dev_9000}" +export BBAV5_QUEUE_PREFIX="${BBAV5_QUEUE_PREFIX:-plantai_4090_9000}" export BBAV5_REDIS_URL="${BBAV5_REDIS_URL:-redis://localhost:6379/10}" export PLANTAI_WEB_PORT="$PORT" export PLANTAI_RESTART_SCRIPT="$SCRIPT_DIR/restart_plantai_9000.sh" -export GENE_FAMILY_MAS_API="http://127.0.0.1:7926" -export DUAL_KB_QA_BASE_URL="http://127.0.0.1:7926" -export RAG_API_URL="http://127.0.0.1:7926/api/v1/qa-v1-1-73/chat" -export DUAL_KB_QA_ROUTE="qa-v1-1-73" +export GENE_FAMILY_MAS_API="${GENE_FAMILY_MAS_API:-${DUAL_KB_QA_BASE_URL:-http://127.0.0.1:7920}}" +export DUAL_KB_QA_BASE_URL="${DUAL_KB_QA_BASE_URL:-$GENE_FAMILY_MAS_API}" +export RAG_API_URL="${RAG_API_URL:-$GENE_FAMILY_MAS_API}" +export DUAL_KB_QA_ROUTE="${DUAL_KB_QA_ROUTE:-qa-v1-1-73}" export PLANTAI_AGENT_STATE_DB="$SCRIPT_DIR/.runtime/agent-state/agent-state.sqlite3" PORT="$PLANTAI_WEB_PORT"