是否有可能指定多个单位的任何一个系统的依赖关系?
目前,我有一个单元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用于支持crypttab
的keyscript
选项,但是在上游重写了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都无法启动,就会失败。