Вопрос или проблема
Я пытаюсь запустить несколько ресурсоемких скриптов на Python на сервере (Ubuntu 14.04.5 LTS) через ssh -Y и tmux. Это работает нормально, пока я не закрою соединение ssh. Если я закрою соединение, текущий запущенный скрипт завершится корректно, но все последующие скрипты получат ошибку
gtk-WARNING **: не удается открыть дисплей: localhost:10.0
Скрипты предназначены только для командной строки, но возможно, какая-то библиотека по каким-то причинам требует дисплей. Если я отключаюсь, дисплея больше нет (таково мое предположение). Есть ли способ это исправить (желательно без root доступа), возможно, способ обмануть Ubuntu, заставив её думать, что дисплей есть, хотя его нет?
ИЗМЕНЕНИЕ:
- Сначала я подключаюсь к VPN, а затем выполняю ssh на сервер (с флагом -Y)
- Я пытаюсь запустить этот скрипт в цикле с разными параметрами каждый раз. Он использует
matplotlib.use('Agg')
, так что matplotlib не должен быть проблемой (?) Я не могу придумать ничего другого. echo $DISPLAY
возвращаетlocalhost:10.0
до появления ошибки. Если я подключаюсь с другого компьютера, он возвращаетlocalhost:13.0
. Если я оставлю терминал на оригинальном компьютере открытым, он все еще будет возвращатьlocalhost:10.0
, однако если я открываю новый терминал, он теперь также будет возвращатьlocalhost:13.0
- X11-Forwarding работает нормально, я могу запускать любые настольные приложения, которые пробовал до сих пор. Проблема возникает с скриптами, которые запускаются после того, как я отключаюсь/выходю.
Попробуйте установить переменную DISPLAY:
export DISPLAY=localhost:10.0
И затем выполните ваши команды.
Ответ или решение
Ваша проблема с ошибкой gtk-WARNING **: cannot open display: localhost:10.0
при запуске Python-скриптов на сервере Ubuntu через SSH является частой ситуацией, особенно в облачных или удаленных средах. Давайте подробно разберем эту проблему и предложим возможные решения.
Причины ошибки
Ошибка возникает из-за того, что, когда вы разрываете SSH-соединение, закрывается также и X-сервер, на который ссылается переменная окружения DISPLAY
. Это происходит, потому что X11-рендеринг (вывод графики) требует активного сеанса, и когда вы выходите из SSH, этот сеанс завершается, что приводит к невозможности открыть дисплей.
Почему другие скрипты работают?
Скрипты, которые вы запускаете до разрыва соединения, могут корректно работать, поскольку они исполняются в контексте текущего X-сессии, которая активна на момент выполнения. Однако скрипты, которые запускаются после закрытия SSH-сессии, не могут подключиться к X-серверу, что и вызывает указанную ошибку.
Решения проблемы
Чтобы решить эту проблему, есть несколько вариантов:
-
Поддержание активной SSH-сессии:
В первую очередь, вы можете попробовать использовать такие инструменты, какtmux
илиscreen
, чтобы поддерживать сессию активной, даже если ваше SSH-соединение разрывается. Это позволит вам запускать ваши скрипты и отключаться, не прерывая выполнение скриптов. -
Симуляция дисплея:
Если графические функции не требуются, вы можете попробовать установить переменную окруженияDISPLAY
до выполнения скриптов, указав на несуществующий дисплей, чтобы избежать ошибок:export DISPLAY=:0
Или:
export DISPLAY=localhost:0
Однако стоит отметить, что это может не сработать, если ваш скрипт действительно требует GUI.
-
Использование виртуального дисплея:
Вы можете установить и использоватьXvfb
(X Virtual Framebuffer) — виртуальный дисплей для X-ы, который будет работать в фоновом режиме и избегать необходимости быть привязанным к реальному дисплею. Вы можете установитьXvfb
следующей командой:sudo apt-get install xvfb
Затем его можно использовать следующим образом:
Xvfb :99 -screen 0 1024x768x16 & export DISPLAY=:99 python ваш_скрипт.py
-
Проверка библиотек:
Убедитесь, что другие используемые вами библиотеки не требуют графического интерфейса. Некоторые из них могут по умолчанию пытаться использовать графику даже если это не требуется, и в этом случае может помочь явное указание им не использовать графический интерфейс.
Заключение
Проблема с gtk-WARNING **: cannot open display
может быть решена несколькими способами, начиная с сохранения активной сессии tmux
или screen
, и заканчивая использованием Xvfb
. Возможно, потребуется провести некоторые тесты, чтобы определить, какие из предложенных решений наиболее эффективно работают в вашем конкретном сценарии. Если у вас есть возможность, обязательно протестируйте каждое из предлагаемых решений и выберите подходящее для вашей задачи.