|
|
|
@ -18,46 +18,6 @@ from config import print_data_dir |
|
|
|
|
|
|
|
|
|
|
|
from general import is_run_local_data |
|
|
|
from general import is_run_local_data |
|
|
|
|
|
|
|
|
|
|
|
def find_free_display(): |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
寻找一个可用的显示编号。 |
|
|
|
|
|
|
|
从 99 开始尝试,最大尝试到 199。 |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
display_num = 99 |
|
|
|
|
|
|
|
max_attempts = 100 # 最大尝试次数,避免无限循环 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for attempt in range(max_attempts): |
|
|
|
|
|
|
|
display = f":{display_num}" |
|
|
|
|
|
|
|
lock_file = f"/tmp/.X{display_num}-lock" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 检查锁文件是否存在 |
|
|
|
|
|
|
|
if os.path.exists(lock_file): |
|
|
|
|
|
|
|
print(f"显示设备 {display} 被锁定,尝试下一个...") |
|
|
|
|
|
|
|
display_num += 1 |
|
|
|
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 尝试启动一个短暂的Xvfb进程来测试端口是否真的空闲 |
|
|
|
|
|
|
|
test_proc = subprocess.Popen( |
|
|
|
|
|
|
|
["Xvfb", display, "-screen", "0", "1x1x1"], |
|
|
|
|
|
|
|
stdout=subprocess.DEVNULL, |
|
|
|
|
|
|
|
stderr=subprocess.PIPE |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
sleep(0.5) # 稍等片刻 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 如果进程很快结束了,通常意味着启动失败(可能是端口被占用或其他错误) |
|
|
|
|
|
|
|
return_code = test_proc.poll() |
|
|
|
|
|
|
|
if return_code is not None: |
|
|
|
|
|
|
|
# 启动失败,尝试下一个端口 |
|
|
|
|
|
|
|
display_num += 1 |
|
|
|
|
|
|
|
test_proc.terminate() |
|
|
|
|
|
|
|
continue |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
# 启动成功!终止测试进程,并返回这个可用的显示编号 |
|
|
|
|
|
|
|
test_proc.terminate() |
|
|
|
|
|
|
|
return display_num |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
raise RuntimeError(f"在尝试了 {max_attempts} 次后,未能找到可用的显示设备端口。") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 如果没有 DISPLAY,自动启动 Xvfb |
|
|
|
# 如果没有 DISPLAY,自动启动 Xvfb |
|
|
|
if "DISPLAY" not in os.environ: |
|
|
|
if "DISPLAY" not in os.environ: |
|
|
|
import atexit |
|
|
|
import atexit |
|
|
|
@ -69,7 +29,7 @@ if "DISPLAY" not in os.environ: |
|
|
|
os.environ["XDG_RUNTIME_DIR"] = runtime_dir |
|
|
|
os.environ["XDG_RUNTIME_DIR"] = runtime_dir |
|
|
|
|
|
|
|
|
|
|
|
# 使用函数查找空闲的显示端口 |
|
|
|
# 使用函数查找空闲的显示端口 |
|
|
|
free_display_num = find_free_display() |
|
|
|
free_display_num = 99 |
|
|
|
display_env = f":{free_display_num}" |
|
|
|
display_env = f":{free_display_num}" |
|
|
|
|
|
|
|
|
|
|
|
# 启动 Xvfb,使用找到的空闲端口 |
|
|
|
# 启动 Xvfb,使用找到的空闲端口 |
|
|
|
|