Назад | Перейти на главную страницу

Почему задание cron не может открыть соединение с дисплеем X

У меня есть приложение 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 = + extension RANDR -screen 0 1024x768x16' /home/username/start.sh

Серверы X11 не запускаются просто по запросу. Должен быть запущенный сервер X11, ваше приложение должно знать о существовании сервера X11, который оно должно использовать, через переменную DISPLAY, и учетная запись должна быть авторизована для подключения к серверу X11, на который указывает переменная DISPLAY ( xauth).

Перенаправление X11, встроенное в SSH, великолепно, потому что оно обрабатывает все эти детали автоматически, так что вам не нужно ничего знать. Но от cron это не поможет.

Ваша проблема в том, что программа ожидает функции, которая может присутствовать на «реальном» X сервере, но отсутствует в Xvfb.

Добавление функций в Xvfb, вероятно, требует больше усилий, чем вы готовы вложить в это. Итак, вы будете искать альтернативы, среди которых несколько:

  • Заставить приложение останавливаться в зависимости от расширения режима отображения.
  • Вместо этого запустите приложение на «реальном» X-сервере.
  • Запустите приложение на другом X-сервере.

Если это ваше собственное приложение, вы сможете выяснить, в какой момент оно пытается использовать расширение режима отображения. Могут ли приложение быть недовольным настройками, которые вы выбрали для Xvfb? Если вам повезет, это может быть так же просто, как приложение, требующее 32-битной глубины цвета, и указание x32 в командной строке вместо x16 может помочь.

Настоящий X-сервер все еще может быть вариантом, даже на виртуальной машине. Это зависит от возможностей эмуляции графики на этой виртуальной машине.

В качестве альтернативы, возможно, стоит попробовать Xvnc, который, как мне кажется, имеет больше возможностей, чем Xvfb.