单元文件在手动启动时起作用。systemctl --user enable
用户登录后不会自动启动该服务。
单位档案
[Unit]
Description = VNC Duplicate Display RDP
After = default.target
[Service]
Type = simple
ExecStart = /opt/tigervnc/usr/bin/x0vncserver -passwordfile /etc/.vncpasswd -display :0
TimeoutSec = 30
RestartSec = 10
Restart = always
[Install]
WantedBy = default.target
我已重新加载并重新启用该装置
$ systemctl --user daemon-reload
$ systemctl --user reenable x0vncserver
地位
用户登录后的状态
● x0vncserver.service - VNC Duplicate Display RDP
Loaded: loaded (/usr/lib/systemd/user/x0vncserver.service; enabled; vendor preset: enabled)
Active: inactive (dead)
目标状态
$ systemctl --user --type target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
default.target loaded active active Default
paths.target loaded active active Paths
sockets.target loaded active active Sockets
timers.target loaded active active Timers
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
5 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
手动启动
$ systemctl --user start x0vncserver
$ systemctl --user status x0vncserver
● x0vncserver.service - VNC Duplicate Display RDP
Loaded: loaded (/usr/lib/systemd/user/x0vncserver.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2017-08-07 18:27:00 IST; 5s ago
Main PID: 2999 (x0vncserver)
CGroup: /user.slice/user-1004.slice/[email protected]/x0vncserver.service
└─2999 /opt/tigervnc/usr/bin/x0vncserver -passwordfile /etc/.vncpasswd -display :0
Aug 07 18:27:00 Machine systemd[930]: Started VNC Duplicate Display RDP.
Aug 07 18:27:00 Machine x0vncserver[2999]: Mon Aug 7 18:27:00 2017
Aug 07 18:27:00 Machine x0vncserver[2999]: Geometry: Desktop geometry is set to 1920x1080+0+0
Aug 07 18:27:00 Machine x0vncserver[2999]: Main: XTest extension present - version 2.2
Aug 07 18:27:00 Machine x0vncserver[2999]: Main: Listening on port 5900
参考
我环顾四周,发现用户有类似的问题,但建议的解决方案都没有解决我的问题
- https://stackoverflow.com/questions/39871883/systemctl-status-shows-inactive-dead
- https://bbs.archlinux.org/viewtopic.php?id=170344
- 为什么我的 Systemd 单元已加载,但处于非活动状态(死机)?
- https://github.com/systemd/systemd/issues/4301
- https://github.com/systemd/systemd/issues/2690
- https://superuser.com/questions/955922/enabled-systemd-unit-does-not-start-at-boot
更新
这发生在特定用户身上。systemctl --user enable
至少适用于同一设备上的另一个用户。
答案1
我遇到了同样的问题,为我解决的方法是使用它,如下所示:
#!/bin/bash
/usr/bin/x0vncserver -PasswordFile=/home/luserid/.vnc/passwd -display=:0
看来如果没有-display=:0
.
答案2
要让 systemd 运行 VNC 服务器,该服务器需要两件事:
$DISPLAY
$XAUTHORITY
如果您在用户总线上运行(您就是这样),这些通常会自动设置。我发现,当这些变量被可靠地设置时,我不需要明确--display
哪个是好的,因为它可以根据我的配置进行更改。 Tigervnc 可能有所不同,但我希望它$DISPLAY
在--display
未指定的情况下使用。
那么,如何确保在启动服务时可靠地设置这些内容呢?
如果您的用户在 X 服务器完全启动并运行之前登录,这些可能不会立即设置。我发现这种情况发生在我使用 GDM 自动登录的系统上,或者如果我在通过显示管理器登录之前通过 SSH 或 TTY 登录的系统。
我在 Debian 系统上使用的解决方案是仅在保证 Xauthority 可用后才运行我的 vnc 服务器。我用一个单位检测到*.path
:
# ~/.config/systemd/user/vnc.path
[Path]
PathExists=%t/gdm/Xauthority
[Install]
WantedBy=default.target
# ~/.config/systemd/user/vnc.service
[Service]
ExecStart=x11vnc -shared -many -nopw
您只需要systemctl --user enable vnc.path
为此工作即可。
路径单元将等待/run/user/1000/gdm/Xauthority
存在。仅当您的用户有权访问显示后,该信息才会存在。创建后,路径单元将启动vnc.service
,您的 VNC 服务器将启动$DISPLAY
并$XAUTHORITY
自动设置变量。
该路径%t/gdm/Xauthority
是 Debian 上的默认路径。 %t
是缩写/run/user/1000
,我喜欢使用该缩写,因为如果您的 UID 不是 1000,它就可以工作。如果您使用不同的发行版,请查看echo $XAUTHORITY
是否需要不同的路径。
边注:
这systemd
设计有一些感兴趣的目标。 default.target
意味着与桌面环境实现的graphical.target
有某种关系的符号链接(例如)。graphical-session.target
gnome-session.target
理论上,使用WantedBy=graphical-session.target
andAfter=graphical-session.target
是对我提到的更简单、更好的解决方案*.path
,但不幸的是,实现需要由桌面环境完成,而这似乎还没有在所有桌面环境上发生。我发现graphical-session.target
并非所有桌面环境都能可靠地提出该问题,因此*.path
我建议使用该解决方案。