我有一个关于为 Systemd 制作自己的单元(服务)文件的问题。
我已阅读文档并有一些问题。经过搜索后,我发现这个非常有用的答案,它提供了有关我遇到的一些问题的一些详细信息。
如何编写运行 systemd-tmpfiles 的 systemd .service 文件
虽然我发现这个答案很有用,但仍有一部分我不明白。主要是这部分:
由于我们实际上希望该服务稍后而不是更快运行,因此我们指定一个“After”子句。这实际上不需要与 WantedBy 目标相同(通常不是)
我对 After 的理解是它非常简单。该服务(或您定义的任何内容)将在 After 中列出的单元之后运行。
同样,WantedBy 看起来也很简单。您正在定义您列出的单位对您的服务有需求。因此,对于多用户或图形等目标,您的单元应该运行,以便 systemd 认为已达到目标。
现在,假设到目前为止我对这些声明如何工作的理解是正确的,我的问题是:为什么在 After 和 WantedBy 子句中列出相同的单位会起作用?
例如,在我看来,定义一个 After multi-user.target 和 WantedBy multi-user.target 的单元会导致一种不可能的情况,即该单元需要在达到目标后启动,但也需要为被视为“达到”的目标而开始。
我误解了什么吗?
答案1
手册讨论了/和/ /之间systemd
的关系Before
After
Requires
Wants
Bindto
Before=, After=
部分:
请注意,此设置独立于并正交于 Requires=、Wants= 或 BindsTo= 配置的需求依赖项。在 After= 和 Requires= 选项中包含单位名称是一种常见的模式,
After
并不意味着Wants
或WantedBy
,也不与这些设置冲突。
如果两个单元都被触发启动,After
将影响顺序,无论依赖链如何。
如果列出的模块After
不在依赖关系链中的某个位置,则不会加载它,因为After
并不意味着任何依赖关系。
答案2
WantedBy
不影响服务启动的顺序。如中所述systemd 单元手册,在WantedBy
和RequiredBy
描述中:
这具有将 Wants= 或 Requires= 类型的依赖项从列出的单元添加到当前单元的效果。
然后在Wants
描述中它指出它是Requires
它所指出的较弱版本:
请注意,需求依赖性不会影响服务启动或停止的顺序。