fix(runtime): standardize 9000 startup and isolate project services
This commit is contained in:
+58
-19
@@ -2,15 +2,19 @@
|
|||||||
# PlantAI-dev 9000 服务管理脚本
|
# PlantAI-dev 9000 服务管理脚本
|
||||||
# 用法: bash manage_plantai.sh {start|stop|restart|status} [--port PORT]
|
# 用法: bash manage_plantai.sh {start|stop|restart|status} [--port PORT]
|
||||||
# 默认端口: 9000
|
# 默认端口: 9000
|
||||||
#
|
|
||||||
# 项目: /home/xzq/5090/teamWorkspace/zh/PlantAI-dev
|
|
||||||
# 端口: 9000 (web), Redis DB 14 (queue prefix: plantai_dev_9002)
|
|
||||||
|
|
||||||
set -euo pipefail
|
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
|
# 解析命令行参数:第一个参数是命令,后面可选 --port / -p
|
||||||
CMD=""
|
CMD=""
|
||||||
WEB_PORT="9000"
|
WEB_PORT="${PLANTAI_WEB_PORT:-9000}"
|
||||||
for arg in "$@"; do
|
for arg in "$@"; do
|
||||||
case "$arg" in
|
case "$arg" in
|
||||||
start|stop|restart|status)
|
start|stop|restart|status)
|
||||||
@@ -33,12 +37,15 @@ done
|
|||||||
CMD="${CMD:-status}"
|
CMD="${CMD:-status}"
|
||||||
|
|
||||||
# Conda 环境:启动脚本内部也依赖这个环境
|
# 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"
|
export PATH="$CONDA_ENV/bin:$PATH"
|
||||||
|
|
||||||
# 项目配置(与 .env 和启动脚本保持一致)
|
# 项目配置(与 .env 和启动脚本保持一致)
|
||||||
PROJECT_DIR="/home/xzq/5090/teamWorkspace/zh/PlantAI-dev"
|
PROJECT_DIR="$SCRIPT_DIR"
|
||||||
QUEUE_PREFIX="plantai_dev_9002"
|
QUEUE_PREFIX="${BBAV5_QUEUE_PREFIX:-plantai_4090_9000}"
|
||||||
|
REDIS_URL="${BBAV5_REDIS_URL:-redis://localhost:6379/10}"
|
||||||
WEB_LOG="/tmp/plantai_${WEB_PORT}.log"
|
WEB_LOG="/tmp/plantai_${WEB_PORT}.log"
|
||||||
CELERY_LOG="/tmp/celery_${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"; }
|
green(){ echo -e "\033[32m$*\033[0m"; }
|
||||||
cyan() { echo -e "\033[36m$*\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() {
|
status() {
|
||||||
echo ""
|
echo ""
|
||||||
cyan "=== PlantAI-dev ${WEB_PORT} 服务状态 ==="
|
cyan "=== PlantAI-dev ${WEB_PORT} 服务状态 ==="
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# Web 服务
|
# 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
|
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
|
else
|
||||||
red "[✗] Web 服务未启动 (端口 $WEB_PORT)"
|
red "[✗] Web 服务未启动 (端口 $WEB_PORT)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Redis
|
# Redis
|
||||||
if redis-cli ping > /dev/null 2>&1; then
|
if redis-cli -u "$REDIS_URL" ping > /dev/null 2>&1; then
|
||||||
green "[✓] Redis 运行中 (localhost:6379)"
|
green "[✓] Redis 运行中 ($REDIS_URL)"
|
||||||
else
|
else
|
||||||
red "[✗] Redis 未启动"
|
red "[✗] Redis 未启动"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Celery workers
|
# Celery workers
|
||||||
CELERY_COUNT=$(pgrep -fc "$QUEUE_PREFIX" || echo 0)
|
CELERY_COUNT="$(pgrep -fc "$QUEUE_PREFIX" || true)"
|
||||||
if [ "$CELERY_COUNT" -gt 0 ]; then
|
if [ "$CELERY_COUNT" -gt 0 ]; then
|
||||||
green "[✓] Celery workers 运行中 (${CELERY_COUNT} 进程, 队列前缀: $QUEUE_PREFIX)"
|
green "[✓] Celery workers 运行中 (${CELERY_COUNT} 进程, 队列前缀: $QUEUE_PREFIX)"
|
||||||
echo " Worker 列表:"
|
echo " Worker 列表:"
|
||||||
@@ -86,13 +114,18 @@ stop() {
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# 停止 Web 服务
|
# 停止 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
|
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)..."
|
echo "正在停止 Web 服务 (PID $WEB_PID)..."
|
||||||
kill "$WEB_PID" 2>/dev/null || true
|
kill "$WEB_PID" 2>/dev/null || true
|
||||||
sleep 1
|
sleep 1
|
||||||
# 如果还没死,强制 kill
|
# 仅强制停止仍属于本项目的原进程,避免 PID 复用造成误杀。
|
||||||
if ss -tlnp 2>/dev/null | grep -q ":$WEB_PORT"; then
|
if kill -0 "$WEB_PID" 2>/dev/null && web_pid_belongs_to_project "$WEB_PID"; then
|
||||||
kill -9 "$WEB_PID" 2>/dev/null || true
|
kill -9 "$WEB_PID" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
green "[✓] Web 服务已停止"
|
green "[✓] Web 服务已停止"
|
||||||
@@ -125,12 +158,18 @@ start() {
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# 检查是否已在运行
|
# 检查是否已在运行
|
||||||
if ss -tlnp 2>/dev/null | grep -q ":$WEB_PORT"; then
|
WEB_PID="$(web_pid_for_port)"
|
||||||
red "[!] 端口 $WEB_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
|
exit 1
|
||||||
fi
|
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"
|
red "[!] Redis 未运行,请先启动 Redis"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -141,7 +180,7 @@ start() {
|
|||||||
echo "正在启动 Celery workers..."
|
echo "正在启动 Celery workers..."
|
||||||
nohup bash start_celery_9000.sh > "$CELERY_LOG" 2>&1 &
|
nohup bash start_celery_9000.sh > "$CELERY_LOG" 2>&1 &
|
||||||
sleep 3
|
sleep 3
|
||||||
CELERY_COUNT=$(pgrep -fc "$QUEUE_PREFIX" || echo 0)
|
CELERY_COUNT="$(pgrep -fc "$QUEUE_PREFIX" || true)"
|
||||||
if [ "$CELERY_COUNT" -gt 0 ]; then
|
if [ "$CELERY_COUNT" -gt 0 ]; then
|
||||||
green " [✓] Celery workers 已启动 (${CELERY_COUNT} 进程)"
|
green " [✓] Celery workers 已启动 (${CELERY_COUNT} 进程)"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -26,13 +26,13 @@ if [ -n "$EXTERNAL_BBAV5_WORKER_NAME_PREFIX" ]; then
|
|||||||
BBAV5_WORKER_NAME_PREFIX="$EXTERNAL_BBAV5_WORKER_NAME_PREFIX"
|
BBAV5_WORKER_NAME_PREFIX="$EXTERNAL_BBAV5_WORKER_NAME_PREFIX"
|
||||||
fi
|
fi
|
||||||
if [ -z "${BBAV5_QUEUE_PREFIX-}" ]; then
|
if [ -z "${BBAV5_QUEUE_PREFIX-}" ]; then
|
||||||
BBAV5_QUEUE_PREFIX="plantai_dev_9000"
|
BBAV5_QUEUE_PREFIX="plantai_4090_9000"
|
||||||
fi
|
fi
|
||||||
if [ -z "${BBAV5_REDIS_URL-}" ]; then
|
if [ -z "${BBAV5_REDIS_URL-}" ]; then
|
||||||
BBAV5_REDIS_URL="redis://localhost:6379/10"
|
BBAV5_REDIS_URL="redis://localhost:6379/10"
|
||||||
fi
|
fi
|
||||||
if [ -z "${BBAV5_CELERY_LOG_DIR-}" ]; then
|
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
|
fi
|
||||||
if [ -z "$EXTERNAL_BBAV5_WORKER_NAME_PREFIX" ]; then
|
if [ -z "$EXTERNAL_BBAV5_WORKER_NAME_PREFIX" ]; then
|
||||||
unset BBAV5_WORKER_NAME_PREFIX
|
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_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_INPUT="${BBAV5_LIGHTWEIGHT_INPUT:-$PROJECT_ROOT/input}"
|
||||||
export BBAV5_LIGHTWEIGHT_WORKSPACE="${BBAV5_LIGHTWEIGHT_WORKSPACE:-$PROJECT_ROOT/workspace}"
|
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}"
|
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_]/_}}"
|
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"
|
mkdir -p "$LOG_DIR"
|
||||||
|
|
||||||
CELERY="$CONDA_ENV/bin/celery"
|
CELERY="$CONDA_ENV/bin/celery"
|
||||||
|
|||||||
+11
-10
@@ -24,6 +24,12 @@ done
|
|||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
cd "$SCRIPT_DIR"
|
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}"
|
CONDA_BASE="${BBAV5_CONDA_BASE:-/home/xia-lab/miniconda3}"
|
||||||
DEFAULT_ENV="${BBAV5_DEFAULT_ENV:-test4py311}"
|
DEFAULT_ENV="${BBAV5_DEFAULT_ENV:-test4py311}"
|
||||||
CONDA_ENV="$CONDA_BASE/envs/$DEFAULT_ENV"
|
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.
|
# the caller's shell; GWAS/other sandboxes have dedicated restart scripts.
|
||||||
export BBAV5_PROJECT_ROOT="$SCRIPT_DIR"
|
export BBAV5_PROJECT_ROOT="$SCRIPT_DIR"
|
||||||
export PLANTAI_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_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_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_INPUT="${BBAV5_LIGHTWEIGHT_INPUT:-$SCRIPT_DIR/input}"
|
||||||
export BBAV5_LIGHTWEIGHT_WORKSPACE="${BBAV5_LIGHTWEIGHT_WORKSPACE:-$SCRIPT_DIR/workspace}"
|
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 BBAV5_REDIS_URL="${BBAV5_REDIS_URL:-redis://localhost:6379/10}"
|
||||||
export PLANTAI_WEB_PORT="$PORT"
|
export PLANTAI_WEB_PORT="$PORT"
|
||||||
export PLANTAI_RESTART_SCRIPT="$SCRIPT_DIR/restart_plantai_9000.sh"
|
export PLANTAI_RESTART_SCRIPT="$SCRIPT_DIR/restart_plantai_9000.sh"
|
||||||
export GENE_FAMILY_MAS_API="http://127.0.0.1:7926"
|
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="http://127.0.0.1:7926"
|
export DUAL_KB_QA_BASE_URL="${DUAL_KB_QA_BASE_URL:-$GENE_FAMILY_MAS_API}"
|
||||||
export RAG_API_URL="http://127.0.0.1:7926/api/v1/qa-v1-1-73/chat"
|
export RAG_API_URL="${RAG_API_URL:-$GENE_FAMILY_MAS_API}"
|
||||||
export DUAL_KB_QA_ROUTE="qa-v1-1-73"
|
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"
|
export PLANTAI_AGENT_STATE_DB="$SCRIPT_DIR/.runtime/agent-state/agent-state.sqlite3"
|
||||||
|
|
||||||
PORT="$PLANTAI_WEB_PORT"
|
PORT="$PLANTAI_WEB_PORT"
|
||||||
|
|||||||
Reference in New Issue
Block a user