我想在服务器上为 x11vnc 设置系统套接字激活,但我没有获得正确的配置来满足我的要求。
我想要:
x11vnc应该停止。x11vnc未运行,则会重新启动。Systemd 为 225,x11vnc 为 0.9.13。
似乎我不能使用简单的x11vnc.socket+ x11vnc.servicefiles 组合,因为x11vnc如果它检测到标准端口 (5900) 已被使用(由 systemd 套接字),它将映射到下一个 TCP 端口(5901)。
所以我使用 systemd“代理”(参见https://www.freedesktop.org/software/systemd/man/systemd-socket-proxyd.html)以便 systemd 在 5901 上监听 5900 和 x11vnc。所以我有:
代理到 x11vnc.socket:
[Socket]
ListenStream=5900
[Install]
WantedBy=sockets.target
Run Code Online (Sandbox Code Playgroud)
代理到 x11vnc.service:
[Unit]
Description=x11vnc
Requires=x11vnc.service
After=x11vnc.service
[Service]
User=myuser
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:5901
Run Code Online (Sandbox Code Playgroud)
x11vnc.service:
[Unit]
Description=x11vnc
[Service]
User=myuser
StandardError=syslog
ExecStart=/usr/bin/x11vnc -auth /home/myuser/.Xauthority -shared -display :0 -rfbport 5901 -noipv6
Run Code Online (Sandbox Code Playgroud)
仅启动/启用代理到 x11vnc.socket。
这种设置的问题是:
x11vnc不会收到连接尝试。x11vnc终止,但我无法重新连接到它。x11vnc.service处于非活动状态(死)的状态。谢谢!
小智 1
不幸的是,您的问题没有完整的解决方案。您的第三点对于当前的 systemd-socket-proxyd 是不可能的,GitHub 上有一个功能请求来解决这个问题。
对于您的第一点,问题是 x11vnc 需要相当长的时间才能启动,并且在完全启动之前不接受连接。解决方案,正如 atlassian在这里提出的那样,是在启动 vnc 服务器后添加睡眠。然后,systemd-socket-proxyd 将在转发通信之前等待。
对于第二点,-sharex11vnc 可以选择允许它接受多个连接。
不幸的是,第三点是不可行的。但您可以使用 手动停止 vnc 服务器systemctl stop x11vnc。
即使您无法自动停止x11vnc,当手动停止服务器时,第四点也会起作用。
总而言之,以下是您需要的文件:
[Socket]
ListenStream=5900
[Install]
WantedBy=sockets.target
Run Code Online (Sandbox Code Playgroud)
[Unit]
Requires=x11vnc.service
After=x11vnc.service
[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:15900
Run Code Online (Sandbox Code Playgroud)
[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
Run Code Online (Sandbox Code Playgroud)
请注意-forever当所有客户端断开连接时保持 vnc 服务器运行的选项。这是我发现在功能请求完成之前能够重新连接的唯一方法。这ExecStartPost是等待 vnc 服务器启动并运行然后让代理转发连接的部分。
#!/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
Run Code Online (Sandbox Code Playgroud)
设置完所有这些脚本后,您就可以启用 x11vnc-proxy.socket 并systemctl enable x11vnc-proxy.socket启动它systemctl start x11vnc-proxy.socket。
| 归档时间: |
|
| 查看次数: |
1920 次 |
| 最近记录: |