我有一个 Java 应用程序,使用 LWJGL 和 OpenGL 渲染一些精灵。它运行良好,直到我将其移动到没有物理显卡的远程虚拟机,使用 Mesa 3d 和相关内容在那里模拟它。当我通过 ssh 连接并手动启动作业时,它运行良好。但作为 cron 作业运行时会引发异常
Caused by: java.lang.RuntimeException: org.lwjgl.LWJGLException: Could not open X display connection
at org.lwjgl.opengl.Display.<clinit>(Display.java:141) ~[lwjgl.jar:na]
... 7 common frames omitted
Caused by: org.lwjgl.LWJGLException: Could not open X display connection
at org.lwjgl.opengl.LinuxDisplay.openDisplay(Native Method) ~[lwjgl.jar:na]
显然 X11 出了问题。
另一个更新:
我发现它在检查是否支持 Xrandr 或 XF86VidMode 时失败了。我安装了它们,但它们有点被禁用了。我尝试明确添加 RANDR,但没有帮助。
xvfb-run -a'--server-args = +扩展 RANDR -screen 0 1024x768x16'/home/username/start.sh
答案1
X11 服务器不会简单地按需启动。必须有一个正在运行的 X11 服务器,您的应用程序必须通过 DISPLAY 变量知道它应该使用的 X11 服务器的存在,并且该帐户必须被授权连接到 DISPLAY 变量指向的 X11 服务器 (xauth)。
SSH 内置的 X11 转发功能非常棒,因为它会自动处理所有这些细节,而您无需了解任何信息。但这不会帮助您使用 cron。
答案2
您的问题是,程序需要某个功能,该功能可能存在于“真实”的 X 服务器上,但 Xvfb 中却没有。
为 Xvfb 添加功能可能比您愿意投入的工作要多。因此,您将寻找替代方案,其中有一些:
- 根据显示模式扩展让应用程序停止。
- 请在“真实” X 服务器上运行该应用程序。
- 在另一个 X 服务器上运行该应用程序。
如果这是您自己的应用程序,您应该能够弄清楚它在什么时候尝试使用显示模式扩展。应用程序可能不满意您为 Xvfb 选择的设置吗?如果您很幸运,它可能就像应用程序需要 32 位颜色深度一样简单,并且在命令行上指定 x32 而不是 x16 会有所帮助。
即使在虚拟机上,真正的 X 服务器可能仍是一个选项。这取决于虚拟机上的图形仿真功能。
或者也许值得尝试使用 Xvnc,我相信它比 Xvfb 具有更多功能。