Почему 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 = + расширение RANDR -экран 0 1024x768x16' /home/username/start.sh

2 ответа

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

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

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

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

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

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

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

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

Другие вопросы по тегам