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