Infelizmente, não há uma solução completa para o seu problema. Seu terceiro ponto não é possível com o systemd-socket-proxyd atual, há uma solicitação de recurso no GitHub para abordar esta questão.
Para o seu primeiro ponto, o problema é que o x11vnc leva muito tempo para iniciar e não aceita conexão até que seja completamente iniciado. A solução, como proposto pelo atlasiano aqui , é adicionar um sono após o início o servidor vnc. O systemd-socket-proxyd esperará antes de encaminhar as comunicações.
Para o segundo ponto, há a opção -share
para x11vnc para permitir que ele aceite mais de uma conexão.
O terceiro ponto infelizmente não é factível. Mas você pode parar o servidor vnc manualmente com systemctl stop x11vnc
.
Mesmo que você não consiga interromper o x11vnc automaticamente, o quarto ponto funcionará quando o servidor for parado manualmente.
Para resumir, aqui estão os arquivos de que você precisa:
/etc/systemd/system/x11vnc-proxy.socket
[Socket]
ListenStream=5900
[Install]
WantedBy=sockets.target
/etc/systemd/system/x11vnc-proxy.service
[Unit]
Requires=x11vnc.service
After=x11vnc.service
[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:15900
/etc/systemd/system/x11vnc.service
[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
Por favor, note a opção -forever
para manter o servidor vnc em execução quando todos os clientes estiverem desconectados. É a única maneira que encontrei de poder reconectar até que a solicitação de recursos seja concluída. O ExecStartPost
é a parte que espera até que o servidor vnc esteja ativo e em execução antes de permitir que o proxy encaminhe a conexão.
/ usr / local / bin / waitport
#!/bin/bash
host=$1
port=$2
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
Com toda essa configuração de scripts, você pode ativar o x11vnc-proxy.socket com systemctl enable x11vnc-proxy.socket
e iniciá-lo systemctl start x11vnc-proxy.socket
.