gtk-WARNING **: не удается открыть дисплей при выполнении скрипта только с командной строки

Вопрос или проблема

Я пытаюсь запустить несколько ресурсоемких скриптов на 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-серверу, что и вызывает указанную ошибку.

Решения проблемы

Чтобы решить эту проблему, есть несколько вариантов:

  1. Поддержание активной SSH-сессии:
    В первую очередь, вы можете попробовать использовать такие инструменты, как tmux или screen, чтобы поддерживать сессию активной, даже если ваше SSH-соединение разрывается. Это позволит вам запускать ваши скрипты и отключаться, не прерывая выполнение скриптов.

  2. Симуляция дисплея:
    Если графические функции не требуются, вы можете попробовать установить переменную окружения DISPLAY до выполнения скриптов, указав на несуществующий дисплей, чтобы избежать ошибок:

    export DISPLAY=:0

    Или:

    export DISPLAY=localhost:0

    Однако стоит отметить, что это может не сработать, если ваш скрипт действительно требует GUI.

  3. Использование виртуального дисплея:
    Вы можете установить и использовать Xvfb (X Virtual Framebuffer) — виртуальный дисплей для X-ы, который будет работать в фоновом режиме и избегать необходимости быть привязанным к реальному дисплею. Вы можете установить Xvfb следующей командой:

    sudo apt-get install xvfb

    Затем его можно использовать следующим образом:

    Xvfb :99 -screen 0 1024x768x16 &
    export DISPLAY=:99
    python ваш_скрипт.py
  4. Проверка библиотек:
    Убедитесь, что другие используемые вами библиотеки не требуют графического интерфейса. Некоторые из них могут по умолчанию пытаться использовать графику даже если это не требуется, и в этом случае может помочь явное указание им не использовать графический интерфейс.

Заключение

Проблема с gtk-WARNING **: cannot open display может быть решена несколькими способами, начиная с сохранения активной сессии tmux или screen, и заканчивая использованием Xvfb. Возможно, потребуется провести некоторые тесты, чтобы определить, какие из предложенных решений наиболее эффективно работают в вашем конкретном сценарии. Если у вас есть возможность, обязательно протестируйте каждое из предлагаемых решений и выберите подходящее для вашей задачи.

Оцените материал
Добавить комментарий

Капча загружается...