Как правильно запустить x11vnc через systemd активацию сокета?

Я хотел бы настроить активацию разъем для x11vnc на сервере, но я не получаю правильную конфигурацию для достижения мои требования.

хотелось бы:

  • открыть новое VNC-соединение с сервером через стандартный порт (5900). Активация сокета должна запустить x11vnc на работающем в данный момент X-сервере.
  • возможность подключения второго клиента к тому же серверу vnc, чтобы они оба могли видеть тот же экран.
  • когда последний клиент отключается, x11vnc должен быть остановлен.
  • новое подключение клиента повторно запускает x11vnc если он не работает.

Systemd находится на 225 и x11vnc на 0.9.13.

кажется, я не могу использовать простой x11vnc.socket+x11vnc.service сочетание файлов, потому что x11vnc отобразится на следующий TCP-порт (5901), если он обнаружит, что стандартный порт (5900) уже используется (сокетом systemd).

поэтому я использую systemd "proxy" (см. https://www.freedesktop.org/software/systemd/man/systemd-socket-proxyd.html), так что systemd слушать 5900 и x11vnc на 5901. Поэтому у меня:

прокси-к-x11vnc.сокет:

[Socket]
ListenStream=5900
[Install]
WantedBy=sockets.target

прокси-к-x11vnc.служба:

[Unit]
Description=x11vnc
Requires=x11vnc.service
After=x11vnc.service
[Service]
User=myuser
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:5901

x11vnc.служба:

[Unit]
Description=x11vnc
[Service]
User=myuser
StandardError=syslog
ExecStart=/usr/bin/x11vnc -auth /home/myuser/.Xauthority -shared -display :0 -rfbport 5901 -noipv6

только прокси-к-x11vnc.сокет запускается/включается.

проблема с этой установки is:

  • при первом подключении клиента я вижу, что x11vnc запускается и слушает правильный порт, но клиентское соединение просто "зависает". Глядя на журналы сервера x11vnc не появляется при попытке соединения.
  • убийство клиента и повторное подключение успешно показать удаленный дисплей.
  • отключение клиента позволит x11vnc завершить, но я не могу повторно подключиться к нему. x11vnc.service находится в неактивные (мертвые) государство.

спасибо!

24
задан big_gie
18.12.2022 4:41 Количество просмотров материала 3465
Распечатать страницу

1 ответ

к сожалению, нет полного решения вашей проблемы. Ваш третий пункт невозможен с текущим systemd-socket-proxyd, есть запрос на GitHub для решения этой проблемы.

для вашего первого пункта, проблема в том, что x11vnc занимает довольно много времени, чтобы начать и не принимает соединение, пока он не будет полностью запущен. Решение, предложенное atlassian здесь добавить сон после запуска сервера vnc. Systemd-socket-proxyd будет ждать перед пересылкой сообщений.

для второго пункта, есть -share опция для x11vnc, позволяющая принимать более одного соединения.

третий пункт к сожалению не выполним. Но вы можете остановить сервер vnc вручную с помощью systemctl stop x11vnc.

даже если вы не можете остановить x11vnc автоматически, четвертая точка будет работать, когда сервер остановлен вручную.

подводя итог, вот необходимые файлы:

/ etc/systemd/system / x11vnc-proxy.сокет

[Socket]
ListenStream=5900

[Install]
WantedBy=sockets.target

/ etc/systemd/system / x11vnc-proxy.служба

[Unit]
Requires=x11vnc.service
After=x11vnc.service

[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:15900

/ etc/systemd/system / x11vnc.служба

[Unit]
Description=VNC Server

[Service]
ExecStart=/usr/bin/x11vnc -forever -shared -rfbport 15900
ExecStartPost=/usr/local/bin/waitport 127.0.0.1 15900

[Install]
WantedBy=graphical.target

обратите внимание:-forever опция, чтобы сохранить сервер vnc работает, когда все клиенты отключены. Это единственный способ я нашел, чтобы быть в состоянии восстановить до запрос сделано. The ExecStartPost это подождите, пока незнаю запущен и работает, прежде чем разрешить прокси-серверу пересылать соединение.

/usr/local/bin / waitport

#!/bin/bash

host=
port=
tries=15

for i in `seq $tries`; do
    if /usr/bin/nc $host $port > /dev/null ; then
        # Ready
        exit 0
    fi

    /bin/sleep 1
done

# FAIL
exit -1

со всеми этими настройками скриптов Вы можете включить x11vnc-proxy.сокет с systemctl enable x11vnc-proxy.socket и запустить его systemctl start x11vnc-proxy.socket.

0
отвечен Damien Plumettaz 2022-12-19 12:29

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх