同一个 systemd 服务的“之前”和“想要”?

The*_*eer 12 dependencies systemd systemd-unit

这个systemd 单元文件示例中:

# systemd-timesyncd.service
...

Before=time-sync.target sysinit.target shutdown.target
Conflicts=shutdown.target
Wants=time-sync.target
Run Code Online (Sandbox Code Playgroud)

systemd-timesyncd.service应该开始之前 time-sync.target。这定义了一个排序依赖

但同时systemd-timesyncd.service time-sync.target。那么time-sync.target它的需求依赖是什么

这种关系的用例是什么,为什么它们彼此之间没有冲突?

Ste*_*itt 16

这种双重关系的用例类似于“提供”关系。systemd-timesyncd提供时间同步服务,因此它满足单元对 的任何依赖time-sync.target。它必须在之前启动,time-sync.target因为它对于任何依赖时间同步的服务都是必要的,并且它想要,time-sync.target因为任何依赖时间同步的单元都应该与systemd-timesyncd服务一起启动。

我认为误解来自你对“想要”的解释。systemd 中的“想要”关系不是依赖:systemd-timesyncd不需要time-sync起作用。这是一个“一起开始”的关系:它表示配置单元 ( systemd-timesyncd.service) 希望列出的单元 ( time-sync.target) 与其一起开始。

另请参阅systemd 中提供 time-sync.target 的服务?


Jde*_*eBP 5

该机制的目的是确保排序关系可以建立,但除非必要,否则不生效

time-sync.target是订购里程碑。所有这一切提供“时间同步”的服务,指定他们Beforetime-sync.target,所以目标只有准备好一次“时间同步”生效。所有这一切需要“时间同步”,以生效,当他们运行指定,他们是服务Aftertime-sync.target

如果后者也Wants与该目标有关系,那么它们最终总是会被它排序,因为它总是包含在有序的事物集中。

在实际上没有具体的“时间同步”服务的情况下,这被认为是次优的;系统人员的想法是,在这种情况下,这种排序不应该有效。相反,服务应该像time-sync.target不存在一样订购,如果这是没有里程碑的“自然”位置,则允许其中一些服务更早启动。

解决方案是time-sync.target实际上不在那里。期望在时间同步可用后启动的服务不需要它。因此,如果启动这些服务,则它不存在于有序事物集中。只有在启动了实际的“时间同步”服务时才将其带入集合,而该服务(而不是客户端服务)具有将Wants其带入的关系。

目标不一定是服务的集合。他们也可以订购里程碑。

在 systemd 和其他地方,有很多这样的纯粹里程碑。name-servicesnosh 工具集的服务包集合中的目标是一个类似的纯排序里程碑。

进一步阅读

  • 乔纳森·德·博因·波拉德 (2018)。system-control. 小吃指南。软件。