Вопрос или проблема
Я не имею представления, как настроить дисплей. Я постоянно получаю следующую ошибку:
xterm: xt ошибка не удается открыть дисплей дисплей xterm не установлен
Я искал информацию в интернете, но не нашел решения. Мог ли бы кто-нибудь помочь мне?
Вероятно, это связано с проблемой неправильной конфигурации или у вас несколько дисплеев. Как видно в справочном руководстве xterm
(man xterm
), вы можете установить дисплей, используя флаг -display
:
-display display
Этот параметр указывает, к какому X серверу обращаться; смотрите X(7).
Если вы посмотрите в X(7)
, где указано, на что следует обратить внимание (man X
), вы увидите, что нужно указывать после флага:
ИМЕНА ДИСПЛЕЕВ
С точки зрения пользователя каждый X сервер имеет имя дисплея
формата:
имя_хоста:номер_дисплея.номер_экрана
Эта информация используется приложением для определения того, как оно
должно подключаться к серверу и какой экран использовать по умолчанию
(на дисплеях с несколькими мониторами):
имя_хоста
Имя хоста указывает на название машины, к которой дисплей
физически подключен. Если имя хоста не указано,
будет использован наиболее эффективный способ связи с сервером
на той же машине.
номер_дисплея
Фраза "дисплей" обычно используется для обозначения группы
мониторов, которые используют общие устройства ввода (клавиатура,
мышь, планшет и т. д.). Большинство рабочих станций имеют только один
дисплей. Однако более крупные многопользовательские системы,
как правило, имеют несколько дисплеев, чтобы более одного
человека мог работать с графикой одновременно. Чтобы избежать путаницы,
каждому дисплею на машине присваивается номер дисплея
(начиная с 0), когда X сервер для этого дисплея запускается.
Номер дисплея всегда должен быть указан в имени дисплея.
номер_экрана
Некоторые дисплеи используют свои устройства ввода между
двумя или более мониторами. Эти мониторы могут быть настроены
как один логический экран, что позволяет перемещать окна между
экранами, или как отдельные экраны, каждый со своим набором
окон. Если настроить так, что каждый монитор имеет свой набор окон,
каждому экрану присваивается номер экрана (начиная с 0),
когда X сервер для этого дисплея запускается. Если номер экрана не
указан, будет использован экран 0.
На системах POSIX имя дисплея по умолчанию хранится в вашей
переменной окружения DISPLAY. Эта переменная устанавливается
автоматически эмулятором терминала xterm. Однако, когда вы входите в
другую машину в сети, вам может понадобиться вручную установить DISPLAY,
чтобы указать ваш дисплей. Например,
% setenv DISPLAY myws:0
$ DISPLAY=myws:0; export DISPLAY
Программа ssh может быть использована для запуска X программы на удаленной
машине; она автоматически правильно устанавливает переменную DISPLAY.
Наконец, большинство X программ принимают опцию командной строки -display
displayname для временного переопределения содержимого DISPLAY. Это чаще
всего используется для открытия окон на экране другого человека или
в качестве части команды "удаленной оболочки", чтобы запустить xterm
с ссылкой обратно на ваш дисплей. Например,
% xeyes -display joesws:0 -geometry 1000x1000+0+0
% rsh big xterm -display myws:0 -ls </dev/null &
X серверы слушают подключения через различные каналы связи
(сетевые потоковые байты, общую память и т. д.). Поскольку
может быть больше одного способа обращения к данному серверу, часть
имени хоста дисплея используется для определения типа канала
(также называемого транспортным слоем), который будет использован.
X серверы обычно поддерживают следующие типы соединений:
локальный
Часть имени хоста дисплея должна быть пустой строкой.
Например: :0, :1 и :0.1. Будет выбран наиболее эффективный
локальный транспорт.
TCPIP
Часть имени хоста дисплея должна быть именем хоста сервера или
IP-адресом. Полные имена в интернете, сокращенные имена,
адреса IPv4 и адреса IPv6 - все это разрешено. Например:
x.org:0, expo:0, [::1]:0,
198.112.45.11:0, bigmachine:1 и hydra:0.1.
Чтобы получить значение вашего дисплея, вы должны просто выполнить:
echo $DISPLAY
В bash-скрипте одним из способов найти дисплей, связанный с пользователем, является выполнение команды who
. Полезные части в этом случае будут именем пользователя и X дисплеем.
На однопользовательской системе вы можете обычно с уверенностью предполагать, что только один пользователь вошел в систему. Для многопользовательского сервера может потребоваться применить некоторую логику для выбора правильного дисплея.
# обработка who для уникального списка пользователей с их дисплеем в виде массива
USERLIST=($(/usr/bin/who | /bin/sed -e 's/[)(]//g' -e 's/ \+/ /g' | /usr/bin/cut -d ' ' -f1,5 | /usr/bin/sort -u | /usr/bin/tr -d '\n'))
# ${USERLIST[1]:-":0.0"} включает предположительное значение по умолчанию для случая, если значение в массиве равно нулю.
xterm -display "${USERLIST[1]:-":0.0"}"
Я нашел решение, если вы используете SSH. На хост-машине выполните команду:echo $DISPLAY
, затем на клиенте SSH: DISPLAY=echoedDisplay:0; export DISPLAY
(echoeddisplay – это дисплей, который хост-машина вернула)
Ответ или решение
Ошибка xterm: xterm ошибка, не удается открыть дисплей, дисплей xterm не установлен, часто возникает в средах, использующих X Window System. Эта ошибка указывает на то, что программа xterm не может подключиться к X-серверу, который отвечает за отображение графического интерфейса. В данном ответе мы подробно рассмотрим возможные причины этой проблемы и способы ее устранения.
Причины ошибки
-
Неустановленная переменная окружения DISPLAY: Переменная окружения DISPLAY указывает, к какому X-серверу следует подключиться. Если она не установлена, xterm не сможет определить, где отображать графику.
-
Использование SSH без перенаправления X11: Если вы подключаетесь к удаленной машине через SSH, необходимо включать пересылку X11, иначе приложение не сможет открыть графический интерфейс.
-
Несоответствующий DISPLAY: Если в системе есть несколько дисплеев или если вы работаете в многопользовательском окружении, может потребоваться указать правильный номер дисплея.
-
Конфликт запуска X-сервера: Если X-сервер еще не запущен или запущен некорректно, это также может привести к подобным ошибкам.
Решения
1. Установка переменной окружения DISPLAY
Для того чтобы проверить, установлена ли переменная DISPLAY, выполните следующую команду в терминале:
echo $DISPLAY
Если переменная не задана или пуста, вы должны установить ее вручную. Например, для локальной машины это может выглядеть так:
export DISPLAY=:0
Если вы находитесь в удаленной SSH-сессии, используйте следующую команду, чтобы перенаправить X11:
ssh -X user@remote_host
После ввода этих команд повторите попытку запуска xterm.
2. Правильное использование SSH
Если вы подключаетесь по SSH и хотите использовать графические приложения, вам нужно убедиться, что пересылка X11 включена. Вы должны использовать флаг -X
или -Y
для SSH:
ssh -X user@remote_host
или
ssh -Y user@remote_host
Затем снова проверьте значение переменной DISPLAY на удаленной машине:
echo $DISPLAY
Если вы видите значение вроде localhost:10.0
, это значит, что пересылка настроена корректно. Если вы видите значение :0
, это может быть причиной ошибки, так как оно указывает на локальный дисплей.
3. Использование опции -display
Как вы уже упомянули, xterm позволяет использовать флаг -display
. Например:
xterm -display ваш_хост:0
Убедитесь, что вы указываете правильный хост и номер дисплея.
4. Скрипт для автоматического определения дисплея
Можно использовать bash-скрипт, который автоматически определяет текущий дисплей. Вот пример такого скрипта:
USERLIST=($(who | sed -e 's/[)(]//g' -e 's/ \+/ /g' | cut -d ' ' -f1,5 | sort -u | tr -d '\n'))
xterm -display "${USERLIST[1]:-":0.0"}"
Этот скрипт извлекает уникальные дисплеи пользователей и запускает xterm с правильным значением.
Вывод
Ошибка «xterm: не удается открыть дисплей» может быть достаточно распространенной, но решение обычно простое. Убедитесь, что переменная окружения DISPLAY установлена правильно, проверьте настройки SSH и используйте опцию -display, если это необходимо. Также полезно автоматизировать поиск дисплея для упрощения работы в многопользовательских системах. Если вам потребуется дополнительная помощь, не стесняйтесь обращаться за поддержкой.