我创建了一个 SystemD 单元来启动服务,而该服务需要另一个单元来预先启动。
我已经用 设置了依赖服务Requires=dependant.service
,这样当depending.service
在引导过程中自动启动时,它首先尝试启动dependant.service
。
问题是如果dependant.service
开始得太早,它就无法开始(我不太确定这里的“太早”是什么意思)。为了解决这个问题,我设置dependant.service
为Restart=always
.
这工作正常 -depending.service
已启用并自动启动,它启动dependant.service
,崩溃然后重新启动,并且总是在第二次尝试时成功启动。
但是depending.service
已经看到dependant.service
's 第一次失败及其失败的Requires=dependant.service
原因。日志显示:
systemd[1]: Dependency failed for depending.
systemd[1]: Job depending.service/start failed with result 'dependency'.
即使dependant
最终成功了,并且两者都有Restart=always
,depending
在初始失败后永远不会重新启动dependant
.
我尝试了 , , 的各种配置,但Requires=
没有找到导致重启后重启的组合。Wants=
BindsTo=
After
depending
dependant
似乎根本原因是
dependant.service
有时开始得太早了:添加Restart
指令有点麻烦。这对我来说表明它缺少时间要求,这就是After
目的。根据服务的类型,您需要在启动服务之前确定需要哪些资源。假设这是与网络相关的,您需要在 的
[Unit]
部分中添加以下内容dependant.service
:通过这样做,您表明在 systemd 尝试启动服务之前基本网络应该可用。否则,systemd 将尝试并行启动尽可能多的服务,这意味着根据启动顺序,您可能基本上没有初始化任何服务,这是一些服务可以容忍的情况,而另一些服务则严重失败。
如果要确保
depending.service
始终以 重新启动dependant.service
,则将 aBindsTo
和添加After
到depending.service
:这些行为记录在
systemd.unit(7)
手册页中。我很少需要使用超过Wants
,Requires
和After
,但是如果您的服务具有特别复杂的启动条件,则可以使用更高级的选项。我发现在创建新服务(或服务组)以查看分发提供的单元文件以查看它们是如何完成并无耻地复制好的部分(尝试
/usr/lib/systemd/system
或/lib/systemd/system
)时很有帮助:他们通常会知道什么After
和Requires
需求对于特定类型的服务很有用。对我
BindsTo
没有帮助。这是(我认为),因为这BindsTo
意味着依赖单元不能在没有依赖单元的情况下运行。但在这种情况下,由于依赖单元第一次启动失败,依赖进程尚未启动。但是根据systemd unit's documentation
PartOf
propagets 每次重新启动后的事件。所以这对我有用: