在多个单元中的任何一个上指定systemd的依赖关系?

是否有可能指定多个单位的任何一个系统的依赖关系?

目前,我有一个单元Z,它依赖于单元A或单元B中的至less一个。

configuration要WantedBy单位A通过单位Z和单位B WantedBy单位Z主要工作。

但是,如果单元A或B中只有一个能够启动,则引导过程会在启动单元Z之前等待另一个单元超时。我想消除此超时。

单元A和B需要超时才能正常工作,但是一旦一个单元启动,在启动单元Z之前不需要等待另一个单元超时。

有没有办法指定单元Z取决于单元A还是单元B,但在启动单元Z之前不需要等待单元A和单元B?

在Debian世界中,包装系统使用Provides来指定类似于我希望在这里完成的东西。

我正在努力完成的

Debian用于支持crypttabkeyscript选项,但是在上游重写了systemd的启动脚本时没有重新实现该选项。 以前,我用一个键盘从USB驱动器读取我的密钥。 目前,我正在使用systemd单元文件来代替keyscript选项(单元A)。 这是完美的。 但是,USB驱动器容易出现故障,所以为了冗余,我想在第二个USB驱动器上携带我的密钥的第二个副本。 我想为第二个USB驱动器(单元B)添加第二个systemd单元文件,以便无论插入哪个USB驱动器, systemd都可以使用该USB驱动器,并且不会超时。

我试过的其他事情

使用Conflicts指定A与B冲突,B与A冲突。不幸的是,systemd在尝试启动单元A或B之前处理冲突,并在尝试启动剩余单元之前从调度程序中删除其中一个单元。 所以Z有时会失败,例如,如果A失败了,但是B会成功,如果B由于与A的冲突而已经被淘汰了。

使用JobTimeoutSec来缩短超时。 不幸的是,如果A和B超时,这可能导致Z失败。

迈克尔汉普顿的build议。 正如他所提到的那样,NTP示例创build了每个客户和目标之间的弱依赖关系。 每个NTP客户端都需要目标,但目标不依赖于每个NTP客户端,所以这是有效的。 然而,正如我所知道的那样,弱依赖不会拉入单元,除非单元还有一个指定附加依赖的[Install]部分。 所以,当我拉我的单位A和B, WantedBy[Install]部分创build阻塞超时。 如果我删除了[Install]部分,则单元A和B将被忽略。

这是系统目标单位的工作。

我没有给出一个人为的例子,而是给出一个真实世界的例子,这个例子已经存在于你的系统中。

考虑NTP。 大多数计算机通过NTP进行同步,但有三种(可能还有更多)NTP客户端可供select:systemd-timesyncd,chronyd或(经典的)ntpd。

这些NTP客户端的每个服务单元都是一个名为time-sync.target的目标的time-sync.target ,并且要求这样做。

 Before=time-sync.target Wants=time-sync.target 

因此,在启动任何NTP客户端时,在NTP客户端启动后启动time-sync.target 。 请注意, time-sync.target本身是空的,实际上并没有做任何事情。

因此,如果您运行的服务要求系统时间已同步,否则将会失败,只有在time-sync.target启动之后,才可以要求它启动。

 After=time-sync.target Requires=time-sync.target 

你应该能够很容易地适应你自己的服务。

我想如果这个function存在的话,那就在systemd.unit手册页里,我在那看不到。

一个解决scheme可以使用一个小的bash脚本,一旦A或B启动就成功,或者如果A和B都无法启动,就会失败。