![systemd:如何从第一次启动时自动启用服务?](https://linux22.com/image/82358/systemd%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BB%8E%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%90%AF%E5%8A%A8%E6%97%B6%E8%87%AA%E5%8A%A8%E5%90%AF%E7%94%A8%E6%9C%8D%E5%8A%A1%EF%BC%9F.png)
我正在使用 systemd 来处理一些任务,并且我有一个服务文件,一旦启用即可正常工作系统控制。
现在,我想从第一次启动时自动启用它。
我知道将替换文件放入 中/etc/systemd/system/
会将同名文件的行为替换为/lib/systemd/system/
.
有没有一种方法可以自动启用服务文件,只需将其放在某个目录中?
答案1
重要的提示:以下内容适用于我在 Ubuntu 下的情况。它应该像 Debian 下一样工作。基于 RPM 的发行版防止默认情况下自动启动,但它仍然可以让您更接近目标。
在大多数情况下,您想要安装它在multi-user.target
使用安装部分如下:
[Install]
WantedBy=multi-user.target
这意味着your-package.postinst
脚本将自动为您启动守护进程。
请注意,如果您有自己的your-package.postinst
脚本,则必须确保包含 Debian 帮助程序,如下所示:
#!/bin/sh
#DEBHELPER#
...your own script here...
如果没有该#DEBHELPER#
模式,打包程序将不会添加默认代码,因此您的守护程序将不会自动启用和启动。添加的代码将启用并启动该服务:
systemctl enable <service-name>
systemctl start <service-name>
除非该服务static
(没有[Install]
如上所示的部分)。静态服务需要启用特殊的命令行,并且默认情况下不可用:
systemctl add-wants multi-user.target <service-name>
正如我们所看到的,该命令包含multi-user.target
默认值#DEBHELPER#
(systemd,实际上)不知道的内容,除非您有一个[Install]
部分。
更新:在较新的版本中,systemd 扩展现在是安装机制的一部分,不再需要以下内容。对于 Ubuntu,我认为是从 22.04 开始的,也许是 21.10 开始的。
该包还必须使用扩展来构建systemd
。这意味着您的debian/rules
文件中包含以下内容:
%:
dh $@ --with systemd --parallel
这应该能让你做好准备。
以防万一,如果你想的话不是启动新安装的服务,您实际上可以通过添加以下内容来防止这种情况:
override_dh_installsystemd:
dh_installsystemd --no-start --no-disable
根据您的系统要求进行混合和匹配。
答案2
sudo systemctl enable <service-name>
将在启动时启用服务。
http://www.dynacont.net/documentation/linux/Useful_SystemD_commands/有一个有用命令的列表。而且总是有man systemctl
和man systemd
。
答案3
你可以使用系统预设对于默认启用的单位。
Systems.preset 允许配置要启用/禁用的一组单元
vendor preset
insystemctl status unit
指的是这个。
有关如何使用此链接的详细信息,请参阅链接的手册页