我正在运行 Ubuntu 20.04 并使用以下命令安装 TightVNC:
sudo apt install xfce4 xfce4-goodies
sudo apt install tightvncserver
vncserver
<input password>
<verify password>
vncserver -kill :1
然后我修改了 ~.vnc/startup 以使其如下:
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &
/etc/systemd/system/ 内部[电子邮件保护]我放:
[Unit]
Description=TightVNC server
After=syslog.target network.target
[Service]
Type=forking
User=jim
#PAMName=login
PIDFile=/home/jim/.vnc/%H:1.pid
#ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :%i > /dev/null 2>1 || :'
ExecStart=/usr/bin/vncserver -geometry 1680x1050
ExecStop=/usr/bin/vncserver -kill :1
[Install]
WantedBy=multi-user.target
我将其设置为在启动时运行
systemctl daemon-reload
systemctl enable --now vncserver@1
启动后,我可以正常连接到 VNC 会话。我可以打开终端窗口,但如果我尝试打开 gedit 或任何其他应用程序,它会在本地工作区打开,就好像我坐在电脑前而不是在我的 VNC 会话中一样。我不知道该如何更改才能解决这种奇怪的行为,也无法在网上找到其他人遇到这种情况的信息。
答案1
某些程序(主要是 GNOME 的一部分)使用“单实例”模式,其中应用程序尝试在 D-Bus(或其他 IPC 系统)上找到其自身的现有实例,并指示在该应用程序已运行的位置打开一个新窗口。如果 gedit 的第一个实例已经在显示器 :0 上运行,那么每当您gedit
再次运行并向现有实例发出“打开新窗口”请求时,该窗口也会显示在 :0 上。
(这在概念上与 emacs/emacsclient 或 urxvtd/urxvtc 类似。Firefox 和其他浏览器也这样做。)
有些程序还将其扩展到最初的启动。也就是说,gedit
它不会直接使用命令来运行应用程序,而是仍然使用 D-Bus,即使没有不是一个已经在那里运行的实例——它将让 dbus-daemon 启动“真实的东西”,它将连接到 $DISPLAY dbus-daemon 当前知道的任何东西。
在这两种情况下,避免这种情况的最佳方法是确保单独的 D-Bus 会话总线为您的整个 TightVNC X11 会话启动:
#!/bin/bash
xrdb $HOME/.Xresources
dbus-run-session startxfce4 &
这将确保 Xfce 拥有自己的 $DBUS_SESSION_BUS_ADDRESS,以及自己的运行程序的命名空间和自己的 DISPLAY 和其他环境的知识。
但这并不理想,因为某些会话组件运行两个实例并不完全安全,但实际上它不会真正造成问题。