防止在 systemd 中启用旧版 init 脚本

防止在 systemd 中启用旧版 init 脚本

我正在将 .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.servicemasked
  • 此外,该包还提供了自己的模板。该模板的任何实例都与屏蔽的完全分离并正常工作。/lib/systemd/system/[email protected]saned.service

换句话说,要得到你想要的,你只需要打包一个/lib/systemd/system/my-service.service指向 的符号链接/dev/null

相关内容