Java Не удается подключиться к серверу окон X11, используя localhost:10.0 в качестве значения переменной DISPLAY.
У меня есть скрипт с использованием Java для подключения к отображению X11 в порту 10.0 на локальном хосте
но я всегда получаю эту ошибку
java.lang.InternalError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:62)
at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:178)
at java.security.AccessController.doPrivileged(Native Method)
at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:142)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:112)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at java.awt.Toolkit$2.run(Toolkit.java:849)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:841)
at ij.io.Opener.openJpegOrGif(Opener.java:367)
at ij.io.Opener.openImage(Opener.java:220)
at ij.io.Opener.openImage(Opener.java:249)
at ij.io.Opener.open(Opener.java:116)
at ij.IJ.open(IJ.java:1112)
at ij.macro.Functions.open(Functions.java:2006)
at ij.macro.Functions.doFunction(Functions.java:129)
at ij.macro.Interpreter.doStatement(Interpreter.java:205)
at ij.macro.Interpreter.doBlock(Interpreter.java:515)
at ij.macro.Interpreter.runUserFunction(Interpreter.java:278)
at ij.macro.Interpreter.getFactor(Interpreter.java:1200)
at ij.macro.Interpreter.getTerm(Interpreter.java:1162)
at ij.macro.Interpreter.getExpression(Interpreter.java:1145)
at ij.macro.Interpreter.getBooleanExpression(Interpreter.java:881)
at ij.macro.Interpreter.getLogicalExpression(Interpreter.java:857)
at ij.macro.Interpreter.getBoolean(Interpreter.java:850)
at ij.macro.Interpreter.doIf(Interpreter.java:829)
at ij.macro.Interpreter.doStatement(Interpreter.java:217)
at ij.macro.Interpreter.doBlock(Interpreter.java:515)
at ij.macro.Interpreter.doStatement(Interpreter.java:241)
at ij.macro.Interpreter.doIf(Interpreter.java:831)
at ij.macro.Interpreter.doStatement(Interpreter.java:217)
at ij.macro.Interpreter.doStatements(Interpreter.java:195)
at ij.macro.Interpreter.run(Interpreter.java:99)
at ij.macro.Interpreter.run(Interpreter.java:65)
at ij.macro.Interpreter.run(Interpreter.java:75)
at ij.plugin.Macro_Runner.runMacro(Macro_Runner.java:127)
at ij.plugin.Macro_Runner.runMacroFile(Macro_Runner.java:112)
at ij.IJ.runMacroFile(IJ.java:103)
at ij.ImageJ.main(ImageJ.java:517)
Я перепробовал все, чтобы решить эту проблему, как:
export DISPLAY=:10.0
export DISPLAY=localhost:10.0
Я пробовал также порт 0.0, но я всегда получаю ту же ошибку
после попытки xhost
xhost +local:all
xhost: unable to open display ""
xhost: unable to open display ":10.0"
Как я могу это исправить, я подумал, что X-сервер не работает, поэтому я попытался startx
его говорит, что работает в этом порту
моя система Ubuntu Server Edition 10.04
34 ответа
Вам необходимо указать -Djava.awt.headless=true
параметр во время запуска.
Удалить переменную DISPLAY
unset DISPLAY
Это помогает в большинстве случаев (например, запуск серверов приложений или других инструментов на основе Java) и позволяет избежать изменения всего этого количества командных строк.
Также может быть удобно добавить его в.bash_profile для выделенного пользователя сервера приложений / инструментов.
Я думаю, что вы работаете в режиме sudo. Пожалуйста, перейдите в режим пользователя и попробуйте снова
В случае, если кто-нибудь попытается запустить автоматические модульные тесты через maven-surefire-plugin на CI(jenkins,..) и получит вышеупомянутую ошибку, обязательно обновите конфигурацию верного плагина:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<systemPropertyVariables>
<java.awt.headless>true</java.awt.headless>
</systemPropertyVariables>
</configuration>
</plugin>
Это исправит это:
/usr/bin/java -Djava.awt.headless=true $Your_program
Для меня вход в систему как -Y вместо -X работал.
Если у вас ненадежный X11, как показано ниже, попробуйте вместо этого флаг -Y (если вы доверяете хосту):
Предупреждение: не удалось установить ненадежную пересылку X11: данные ключа xauth не созданы
Это устранило мою проблему
xhost +
но имейте в виду, что xhost +
полностью деактивирует аутентификацию и позволяет каждому получить доступ ко всем приложениям на вашем экране.
xhost +si:localuser:root
похоже, работает аналогично при правильной аутентификации.
Если вы пытаетесь экспортировать отображение с помощью su, но это все равно не работает. Это то, что у меня сработало. Попробуйте перенаправление X11 для пользователей sudo.
Подключите удаленный хост с помощью опции -X с ssh.
# ssh -X root@remote-host
Теперь перечислите набор кукол для текущего пользователя.
# xauth list $DISPLAY
node01.thegeekdiary.com/unix:10 MIT-MAGIC-COOKIE-1 dacbc5765ec54a1d7115a172147866aa
# echo $DSIPLAY
localhost:10.0
Переключитесь на другую учетную запись пользователя с помощью sudo. Добавьте файл cookie из вывода команды выше пользователю sudo.
# sudo su - [user]
# xauth add node01.thegeekdiary.com/unix:10 MIT-MAGIC-COOKIE-1 dacbc5765ec54a1d7115a172147866aa
Снова экспортируйте отображение из шага 2 для пользователя sudo. Попробуйте выполнить команду xclock, чтобы убедиться, что клиентские приложения x работают должным образом.
# export DISPLAY=localhost:10.0
После нескольких дней тщетных усилий по установке Glassfish на Raspberry Pi 2 с безголовой Fedora 22, ниже работал без сучка и задоринки
unset DISPLAY
java -Djava.awt.headless=true -jar glassfissh-installer-v2ur2-b04-linux.jar
получил мою помощь отсюда
Во-первых: запустить XQuartz
Второе: ssh -X user @ ip_address
...: начать свой процесс
если вы ssh, а затем запустите XQuartz, вы получите эту ошибку
Сначала сделайте это либо в фазе сборки Jenkins, если используете, либо установите в /etc/profile:
unset DISPLAY
export DISPLAY=:0
затем установите это свойство либо в коде Java, либо с помощью maven: -Djava.awt.headless=false
Я использовал Xming и получил похожую ошибку. Для решения проблемы были предприняты следующие шаги:
- При запуске Xming установите флажок без контроля доступа.
- В шпатлевке выполнялась следующая команда:
DISPLAY=XXX.XXX.XXX.XX:0.0; export DISPLAY
замещать XXX.XXX.XXX.XX
с вашим IP-адресом.
Проверьте , установлена ли переменная $DISPLAY или нет, с помощью следующей команды:
echo $DISPLAY
если отображаемая переменная не установлена, запустите приведенную ниже команду, чтобы установить, (даже если она установлена, для вашего сеанса вы можете иметь значение ниже)
экспорт DISPLAY=:0.0
в замазке также есть расположение отображения x как: 0,0
Michael-O дал полезный подход для решения проблемы. Другой способ решить эту проблему - запустить сервер с консолью Putty.
Для Ubuntu 17.10 Установите виртуальный фрейм-буфер X (xvfb)
apt install xvfb
И добавил эти строки в файл /etc/profile...
# Start the X virtual frame buffer (Xvfb)
if [ -f /usr/X11R6/bin/Xvfb ]; then
/usr/X11R6/bin/Xvfb :1 -screen 0 1366x768x32
fi
# Set the DISPLAY variable for the X virtual frame buffer (Xvfb)
export DISPLAY=localhost:1.0
В моем случае в моей машине не осталось места, и я столкнулся с той же проблемой. Иногда это может быть космическая проблема. Проверьте пространство в вашей среде Linux/Unix и убедитесь, что на вашем компьютере достаточно места.
У меня была такая же проблема на сервере Linux, над которым я работал. Подключение java к дисплею X11 работало на головном узле, но не на любом другом. После обращения к администратору выяснилось, что текущая версия нашей системы планирования заданий (SLURM) не поддерживает пересылку X11. Им пришлось обновить SLURM (новые версии SLURM поддерживают его), чтобы он заработал.
Если вы запускаете код из Jenkins, может помочь включение опции "Запустите Xvfb перед сборкой и выключите ее после". Это помогло мне.
Я столкнулся с той же ошибкой с вами, когда я запускаю команду jconsole на удаленном компьютере. Я хочу изменить параметр в jconsole, который запускается на удаленном хосте Linux, я могу войти на хост с помощью secureCRT, терминал выдает эту информацию об ошибке. К счастью, когда вы используете шпаклевку, это нормально. Weird....
Я просто не вышел из системы до запуска./studio.sh Все готово.
В моем случае эта ошибка не была связана с портом DISPLAY. Я пытался загрузить XML в Windchill (PLM-программу) и получил только указанную выше ошибку на терминале. В лог -файле я обнаружил сообщение о том, что мой XML-файл поврежден. Может быть, у кого-то есть похожая проблема, и он может использовать этот ответ.
Единственный способ заставить его работать - запустить скрипт с шаблоном. например, sudo ./glassfish-3.1.2.2-unix.sh -s template
Это устанавливает Glassfish в тихом режиме. http://docs.oracle.com/cd/E18930_01/html/821-2427/ghmva.html
Моя проблема была в брандмауэре. Временно отключил.
[РЕДАКТИРОВАТЬ] И имя хоста сервера указывало на другой IP. Установите просто localserver.strace xclock
помог отладить эту проблему.
Перейдите к другому пользователю и попробуйте, кроме root. меня устраивает.
запуск ниже cmd исправил мою проблему. работает для моего случая
unset DISPLAY
В моем случае у меня была именно эта ошибка, когда я запускал IDE Jetbrains, такие как Pycharm, IntelliJ IDEA...
Я набрал это в том же терминале, который использовал для запуска IDE для решения проблемы:
export DISPLAY=:1
Затем я запустил IDE с того же терминала, выполнив командуpycharm
и это сработало как шарм.