我正在将 .deb 包从旧版 SysV 样式的 init 脚本更新为本机 systemd 单元。不过,我想暂时将旧的初始化脚本保留在包中,以供其他初始化系统的用户使用。可以将相关服务配置为在系统上以多个用户身份运行。
对于旧的初始化脚本,管理员将所需的用户添加到特定组,初始化脚本负责为每个用户启动服务实例。对于 systemd,我想使用模板为每个用户启用单独的实例。例如,systemctl enable my-service@user1; systemctl enable my-service@user2
。这允许每个用户的实例独立启动和停止,而不是全部启动和停止。
通常,当一个包同时具有 SysV 样式的 init 脚本和 systemd 单元时,它们将具有相同的名称,因此本机 systemd 单元将隐藏 init 脚本,确保 systemd 用户使用 systemd 单元。然而,在这种情况下,由于新单元是模板,因此它确实不是隐藏 init 脚本。如何阻止 systemd 用户启用 init 脚本,并引导他们使用 systemd 服务模板?
答案1
在 Debian 中,这是通过各种服务完成的,例如saned
:
- SysVinit 风格的脚本是
/etc/init.d/saned
,通常会导致systemd-sysv-generator
自动生成saned.service
. - 但该包通过提供符号链接来禁用此功能
/lib/systemd/system/saned.service -> /dev/null
,该链接既阻止自动生成,又导致将其systemd
视为.saned.service
masked
- 此外,该包还提供了自己的模板。该模板的任何实例都与屏蔽的完全分离并正常工作。
/lib/systemd/system/[email protected]
saned.service
换句话说,要得到你想要的,你只需要打包一个/lib/systemd/system/my-service.service
指向 的符号链接/dev/null
。