(我已将这个问题交叉发布在系统 github)
我有两个守护进程,一个是 a.service,它依赖于一个实例[电子邮件受保护]。我不一定知道它的名字是什么[电子邮件受保护]instance 是在写入单元文件时,但 a.service 肯定会依赖于正在运行的这些实例之一。
我的解决方案是创建一个b.target,其中[电子邮件受保护]包含PartOf=a.target
和WantedBy=a.target
。
我希望 b.target 能够在graphical.target 启动时随时启动,所以理想情况下我希望 b.target 为WantedBy=graphical.target
。 a.service 也应该是WantedBy=graphical.target
,但也需要是Requisite=b.target
and After=b.target
(它不应该启动 b.target,并且如果 b.target 未启动则应该失败)。
[ a.service ]
| |
| Depends on |
v v
[ b.target ] <--is part of--[[email protected]]
| |
| Should be |
| started by |
v v
[graphical.target]
这systemd.target 文档指定使用子句安装目标Requires=
,但如果我这样做,它会创建一个依赖循环,而实际上我希望它是RequiredBy或WantedBygraphical.target,而不是相反。
WantedBy=graphical.target
当且仅当我向 b.target添加 [Install] 部分时,此操作才有效。文档似乎没有表明应该这样做,但它可以工作 - 启动时,graphical.target 正确启动 b.target,b.target 启动[电子邮件受保护],并且graphical.target还启动了a.service,它正确地等待[电子邮件受保护]开始。
这是处理依赖于实例化服务的服务的正确方法吗?这是处理目标之间依赖关系的正确方法吗?仅仅因为某件事有效并不一定意味着它是正确的方法,特别是 systemd 有一种“系统方式”来做事情,如果遵循这种“系统方式”,往往会缓解以后的麻烦。