我想在服务器上为 x11vnc 设置系统套接字激活,但我没有获得正确的配置来满足我的要求。
我想:
- 在标准端口 (5900) 上打开与服务器的新 VNC 连接。套接字激活应在当前运行的 X 服务器上启动 x11vnc。
- 能够将第二个客户端连接到同一个 vnc 服务器,以便他们可以看到同一个屏幕。
- 当最后一个客户端断开连接时,
x11vnc
应该停止。 x11vnc
如果客户端连接未运行,则会重新启动新的客户端连接。
Systemd 为 225,x11vnc 为 0.9.13。
似乎我不能使用简单的x11vnc.socket
+x11vnc.service
文件组合,因为x11vnc
如果它检测到标准端口 (5900) 已被使用(由 systemd 套接字),它将映射到下一个 TCP 端口 (5901)。
因此我使用 systemd“代理”(参见https://www.freedesktop.org/software/systemd/man/systemd-socket-proxyd.html)以便 systemd 监听 5900 和 5901 上的 x11vnc。所以我有:
代理到 x11vnc.socket:
[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.socket已启动/启用。
此设置的问题是:
- 在第一次客户端连接时,我看到 x11vnc 已启动并监听正确的端口,但客户端连接只是“挂起”。查看服务器日志
x11vnc
未收到连接尝试。 - 终止客户端并重新连接后成功显示远程显示。
- 断开客户端将使其
x11vnc
终止,但我无法重新连接到它x11vnc.service
。不活跃(死亡)状态。
谢谢!
答案1
不幸的是,你的问题没有一个完整的解决方案。你的第三点在当前的 systemd-socket-proxyd 中是无法实现的,有一个功能要求在 GitHub 上解决这个问题。
对于您的第一点,问题在于 x11vnc 需要很长时间才能启动,并且直到完全启动后才接受连接。解决方案由 atlassian 提出这里是在启动 vnc 服务器后添加一个睡眠。systemd-socket-proxyd 随后会等待,然后再转发通信。
对于第二点,-share
x11vnc 有一个选项允许它接受多个连接。
不幸的是,第三点不可行。但你可以用 手动停止 vnc 服务器systemctl stop x11vnc
。
即使您无法自动停止 x11vnc,当手动停止服务器时,第四点也会起作用。
总而言之,以下是您需要的文件:
/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
请注意,-forever
当所有客户端断开连接时,保持 vnc 服务器运行的选项。我发现这是唯一能够重新连接的方法,直到功能要求就完成了。这ExecStartPost
是等待 vnc 服务器启动并运行后再让代理转发连接的部分。
/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
设置完所有这些脚本后,您就可以启用 x11vnc-proxy.socket 并systemctl enable x11vnc-proxy.socket
启动它systemctl start x11vnc-proxy.socket
。