From 4479c4f02d1f908fabfb32f6cf751732ec49c522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Mon, 23 Feb 2026 19:18:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(recommendations):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E6=9C=8D=E5=8A=A1=E8=BF=9B=E7=A8=8B=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新 `_recommendations_process_running` 函数,增强对推荐服务进程的检查能力,支持 pgrep 和 ps 方式,确保在不同环境下均能准确获取进程状态。此改动提升了系统的稳定性与兼容性,确保推荐服务的有效管理。 --- backend/api/routes/system.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/backend/api/routes/system.py b/backend/api/routes/system.py index 6535c4f..6baa722 100644 --- a/backend/api/routes/system.py +++ b/backend/api/routes/system.py @@ -1355,18 +1355,35 @@ async def backend_stop(_admin: Dict[str, Any] = Depends(require_system_admin)) - def _recommendations_process_running() -> Tuple[bool, Optional[int]]: - """检查推荐服务进程是否运行,返回 (running, pid)""" + """检查推荐服务进程是否运行,返回 (running, pid)。兼容 pgrep/ps 及 supervisor 等启动方式。""" + # 1. 优先 pgrep(Linux/macOS 常见) + for pattern in ["trading_system.recommendations_main", "recommendations_main"]: + try: + result = subprocess.run( + ["pgrep", "-f", pattern], + capture_output=True, + text=True, + timeout=5, + ) + if result.returncode == 0 and result.stdout.strip(): + pids = [x for x in result.stdout.strip().split() if x.isdigit()] + if pids: + return True, int(pids[0]) + except (FileNotFoundError, subprocess.TimeoutExpired, ValueError): + break + + # 2. 回退:ps + grep(pgrep 不可用或匹配失败时) try: result = subprocess.run( - ["pgrep", "-f", "trading_system.recommendations_main"], + ["sh", "-c", "ps aux 2>/dev/null | grep -E 'recommendations_main|trading_system.recommendations' | grep -v grep | head -1"], capture_output=True, text=True, timeout=5, ) if result.returncode == 0 and result.stdout.strip(): - pids = result.stdout.strip().split() - pid = int(pids[0]) if pids else None - return True, pid + parts = result.stdout.strip().split() + if len(parts) >= 2 and parts[1].isdigit(): + return True, int(parts[1]) except (FileNotFoundError, subprocess.TimeoutExpired, ValueError): pass return False, None