如何让 systemd 目标停止来自其他目标的服务?

如何让 systemd 目标停止来自其他目标的服务?

我想要有几个systemd目标,将它们称为TargetATargetB、 和TargetC,控制一组服务,Service01通过调用它们Service7。配置看起来像这样:

  • TargetA
    • Service1
    • Service2
    • Service3
  • TargetB想要
    • Service3
    • Service4
    • Service5
  • TargetC想要
    • Service5
    • Service6
    • Service7

目标:

  • 一次只允许启用一个目标
  • 系统管理员应该能够随意手动启动和服务

我的初始设置包括:

  • 每个目标都与其他两个目标发生冲突
  • 每项服务均已StopWhenUnneeded=true启用

这就满足了第一个要求。开始TargetX阻止了另外两个目标。不幸的是,这种设置限制了系统管理员。如果系统管理员运行sudo systemctl start ServiceX该服务,则会启动该服务,然后立即终止,因为不需要它。

我的第二个设置涉及:

  • 每个目标都与其他两个目标发生冲突
  • 每个目标也与它不需要的服务发生冲突
  • 没有服务有StopWhenUnneeded=true

例如:

  • TargetA
    • 想要
      • Service1
      • Service2
      • Service3
    • 冲突
      • Service4
      • Service5
      • Service6
      • Service7
      • TargetB
      • TargetC

这没有达到预期的效果。如果我运行:

sudo systemctl start TargetA.target

其次是:

sudo systemctl start TargetB.target

thenTargetA.target停止了(耶!),但Service1仍在Service2运行。

我没有得到什么?我怎样才能获得systemd我正在寻找的行为?

答案1

建议的方法:

  1. 用于systemctl isolate启动 3 个目标中的每一个。正如 中所述man systemctl,这是一个功能强大的命令:“isolate 命令将立即停止新单元中未启用的进程,可能包括您当前正在使用的图形环境或终端。”仔细构建您的目标依赖关系!可能包含multi-user.target为依赖项。
  2. 确保目标启动的第一个服务是一个特殊的服务,用于检查其他目标是否处于活动状态。这可以防止管理员意外“启动”您的自定义目标之一,而不是“隔离”它。您可以用来/bin/systemctl is-active your.target快速检查它是否返回“活动”。

相关内容