|
|
@@ -129,12 +129,34 @@ def _decrement_service_count(lock_file: object) -> int:
|
|
|
return 0
|
|
|
|
|
|
|
|
|
+def _systemd_available() -> bool:
|
|
|
+ """检测当前环境是否有 systemd(容器内通常无 systemd,无法操作 mineru-api.service)"""
|
|
|
+ try:
|
|
|
+ r = subprocess.run(
|
|
|
+ ["systemctl", "status", "--no-pager"],
|
|
|
+ capture_output=True,
|
|
|
+ text=True,
|
|
|
+ timeout=3,
|
|
|
+ check=False,
|
|
|
+ )
|
|
|
+ err = (r.stderr or "") + (r.stdout or "")
|
|
|
+ if "Failed to connect to bus" in err or "not been booted with systemd" in err:
|
|
|
+ return False
|
|
|
+ return True
|
|
|
+ except (FileNotFoundError, subprocess.TimeoutExpired, Exception):
|
|
|
+ return False
|
|
|
+
|
|
|
+
|
|
|
def stop_mineru_service() -> bool:
|
|
|
"""停止mineru-api.service以释放GPU内存(线程安全)
|
|
|
+ 容器内无 systemd 时直接返回 True,不报错。
|
|
|
|
|
|
Returns:
|
|
|
- True表示成功停止或已停止,False表示失败
|
|
|
+ True表示成功停止或已停止/无需操作,False表示失败
|
|
|
"""
|
|
|
+ if not _systemd_available():
|
|
|
+ logger.debug("[PaddleOCR] 无 systemd,跳过停止 mineru-api.service")
|
|
|
+ return True
|
|
|
lock_file = _acquire_service_lock()
|
|
|
if not lock_file:
|
|
|
# 如果无法获取锁,等待一小段时间后检查服务状态
|
|
|
@@ -200,10 +222,14 @@ def stop_mineru_service() -> bool:
|
|
|
|
|
|
def start_mineru_service() -> bool:
|
|
|
"""启动mineru-api.service(线程安全)
|
|
|
+ 容器内无 systemd 时直接返回 True,不报错。
|
|
|
|
|
|
Returns:
|
|
|
- True表示成功启动或已启动,False表示失败
|
|
|
+ True表示成功启动或已启动/无需操作,False表示失败
|
|
|
"""
|
|
|
+ if not _systemd_available():
|
|
|
+ logger.debug("[PaddleOCR] 无 systemd,跳过启动 mineru-api.service")
|
|
|
+ return True
|
|
|
lock_file = _acquire_service_lock()
|
|
|
if not lock_file:
|
|
|
# 如果无法获取锁,等待一小段时间后检查服务状态
|