启用自定义目标的正确方法

启用自定义目标的正确方法

(我已将这个问题交叉发布在系统 github

我有两个守护进程,一个是 a.service,它依赖于一个实例[电子邮件受保护]。我不一定知道它的名字是什么[电子邮件受保护]instance 是在写入单元文件时,但 a.service 肯定会依赖于正在运行的这些实例之一。

我的解决方案是创建一个b.target,其中[电子邮件受保护]包含PartOf=a.targetWantedBy=a.target

我希望 b.target 能够在graphical.target 启动时随时启动,所以理想情况下我希望 b.target 为WantedBy=graphical.target。 a.service 也应该是WantedBy=graphical.target,但也需要是Requisite=b.targetand 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 有一种“系统方式”来做事情,如果遵循这种“系统方式”,往往会缓解以后的麻烦。

相关内容