与之前的版本不同,Ubuntu 15.04 现在使用systemd
而不是upstart
。为了在启动时启动程序,我总是在 中创建 conf 文件/etc/init/
。它们看起来像这样:
start on login-session-start
script
/usr/bin/x11vnc -auth /var/run/lightdm/root/:0 -display :0 -rfbauth /etc/x11vnc.pass -rfbport 5900 -noxrecord -noxfixes -noxdamage -forever -bg -o /var/log/x11vnc.log
end script
不幸的是,这在 Ubuntu 15.04 中不再起作用,我试图找到一个与此 conf 文件等效的、与 systemd 一起运行的文件。尽管互联网上还没有这么多资源。
在启动时启动上述 conf 文件需要什么?upstart 和 systemd 之间有转换器吗?
答案1
如果需要,您可以创建一个.service
执行相同操作的 systemd 文件。.service
上述命令的基本 systemd 文件可能如下所示:
[Unit]
Description=Start VNC server
Requires=lightdm.service
After=lightdm.service
[Service]
ExecStart=/usr/bin/x11vnc -auth /var/run/lightdm/root/:0 -display :0 -rfbauth /etc/x11vnc.pass -rfbport 5900 -noxrecord -noxfixes -noxdamage -forever
[Install]
WantedBy=graphical.target
注意事项:
- 因为此服务依赖于 lightdm 的启动,所以我添加了一个
Requires=lightdm.service
。这意味着如果请求启动此服务,则lightdm.service
也会要求启动,但如果lightdm.service
启动失败,则不会要求启动此服务。此外,After=lightdm.service
需要 ,以便此服务在 lightdm.service 启动完成后启动。 - 正在运行的命令没有
-bg
指定。在 systemd 中,最好让服务保持在前台,以便 systemd 知道它们正在运行。请注意,它是可以为进入后台的服务指定 PID 文件。 WantedBy=graphical.target
指定作为启动 GUI 的一部分,这也应该启动。
要安装此文件以便服务以 root 身份运行,请将此文件添加到 中/etc/systemd/system
。然后,运行sudo systemctl enable <filename>
(其中<filename>
是服务文件的名称/etc/systemd/system
)。应该在 中创建一个符号链接/etc/systemd/system/graphical.target.wants/
。重新启动后,当您运行 时systemctl status <filename>
,您应该会看到该服务已被识别但尚未启动。
请注意,/etc/systemd/system/
是用于系统管理员(您)添加的系统范围服务。/lib/systemd/system/
是用于软件包安装的系统范围服务。您无需创建符号链接/lib/systemd/system/
即可加载服务。下表(取自systemd.unit
手册页)描述了与系统服务相关的每个位置的用途(用户服务有单独的路径):
┌────────────────────┬─────────────────────────────┐
│Path │ Description │
├────────────────────┼─────────────────────────────┤
│/etc/systemd/system │ Local configuration │
├────────────────────┼─────────────────────────────┤
│/run/systemd/system │ Runtime units │
├────────────────────┼─────────────────────────────┤
│/lib/systemd/system │ Units of installed packages │
└────────────────────┴─────────────────────────────┘