Files
jxxghp 2c0ea1d0c6 fix(display): 避免固定编号导致 Xvfb 启动冲突 (#7217)
移除将 DISPLAY 追加到 Xvfb 命令的参数,交由显示后端分配空闲编号。补充真实命令构造、显示环境恢复和重复启停的回归测试。

Refs #7212
2026-10-27 13:03:48 +08:00

61 lines
1.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
虚拟显示进程的托管资源实现。
"""
from __future__ import annotations
from typing import Any, Optional
from app.adapters.system.host import SystemUtils
from app.runtime.log import logger
class VirtualDisplayResource:
"""
按需拥有一个容器内虚拟显示进程。
"""
def __init__(self) -> None:
"""
初始化显示句柄,实际进程在首次启动时创建。
"""
self._display: Optional[Any] = None
@property
def display(self) -> Optional[Any]:
"""
返回当前拥有的显示对象;未启动或已停止时为 None。
:return: 当前资源拥有的显示对象
"""
return self._display
def start(self) -> None:
"""
仅在容器环境启动虚拟显示,重复启动保持幂等。
由显示后端分配空闲编号并管理 DISPLAY,避免与已有显示进程冲突。
"""
if self._display is not None or not SystemUtils.is_docker():
return
from pyvirtualdisplay import Display
display = Display(
visible=False,
size=(1024, 768),
)
self._display = display
display.start()
def stop(self) -> None:
"""
停止当前资源拥有的显示进程,失败时保留句柄供 Runtime 重试。
"""
display = self._display
if display is None:
return
logger.info("正在停止虚拟显示...")
display.stop()
self._display = None
logger.info("虚拟显示已停止")