Назад | Перейти на главную страницу

Как программно проверить, возможно ли подключиться к X-серверу, указанному в $ DISPLAY

Это что-то среднее между программированием и администратором сервера, но, в конечном счете, это наиболее подходящее место для него.

Я ищу способ определить, является ли переменная$DISPLAY'рекламирует XServer, к которому мы действительно можем подключиться, то есть, если вся проверка подлинности и все такое, чтобы разрешить выполнение дальнейших действий.

В идеале я ищу какой-нибудь инструмент для оболочки, который возвращает true / false, который можно использовать в сценарии сборки, чтобы определить, должны ли выполняться другие тесты в нем (которые я не контролирую) или нет.

В настоящее время тесты просто проверяют env переменная "$DISPLAY", и если он есть, попытается подключиться, а когда подключение не работает, тесты предполагают сбой теста, а не просто дисплей не подключается.

Мне просто нужно уметь делать

if [[ ! can_connect_to_X ]] ; then 
    unset DISPLAY
fi

Для того, чтобы у этих тестов не было серьезных психических проблем.

В идеальной ситуации инструмент, необходимый для этого, должен поставляться с самими библиотеками X Client, чтобы не создавать особых зависимостей и иметь возможность предположить, что если утилиты нет, мы не можем подключиться ни к какому дисплею.

Вы можете попробовать с помощью команды xset:

if [[ ! $(xset -q) ]]; then
   # the X server is not reachable
else
   # the X server is reachable
fi

Думаю, есть лучшее решение. Но вы всегда можете просто использовать небольшой инструмент, например xclock, и проверить статус выхода.

if [[ ! xclock ]]; then
  exit 1
fi
pkill xclock

Но человек, что является некрасиво :-)

Меньше хаки, поместите в checkX.c следующее:

#include <X11/Xlib.h>
#include <stdio.h>

int main() 
{
    Display *display;
    if( ! (display=XOpenDisplay(NULL) ) ) {
        return(1);
    }
    return 0;
}

Затем:

gcc -lX11 checkX.c -o checkX
chmod +x checkX

Наконец:

if ./checkX; then
   echo "We are good to go!"
fi

Вот возможный способ WayToDoIt, но не уверен, насколько он хорош.

  x_works(){
     # If there is no xdpyinfo
     # Bash will return 127
     # If X cant connect, it returns 1
     # If X can connect, it returns 0
     xdpyinfo 1>/dev/null 2>&1
     WORKS="$?"
     return $WORKS
  }

  if x_works; then 
   ...

это появляется работать.