我有两项服务,一项是核心服务,一项是本质上监督核心服务的服务。它们的生命周期指定如下:
- 核心服务启动时应启动监视服务
- 当核心服务出现故障时,守望先锋服务应该保持活动状态
将这些约束实现为两个 systemd 服务非常简单,只需拥有两个独立的服务,并core
启动overwatch
:
core.service
[Unit]
Description=Some Core Service
Wants=overwatch.service
[Service]
Type=forking
ExecStart=/some/core/executable
# ...
overwatch.service
[Unit]
Description=Some Overwatch Service
[Service]
Type=simple
ExecStart=/some/overwatch/executable
# ...
不过,我有另一个限制: 启动期间core
,overwatch
服务无法处于活动状态。我尝试的解决方案是overwatch
在开始之前立即停止core
,然后再开始overwatch
。为此,我尝试向服务添加一个ExecStartPre
和一个Before
指令core
,如下所示:
[Unit]
Description=Some Core Service
Wants=overwatch.service
Before=overwatch.service
[Service]
Type=forking
ExecStart=/some/core/executable
ExecStartPre=+systemctl stop overwatch.service
# ...
现在overwatch
如果死亡仍然活着,但它也会在再次开始core
之前成功停止。但是,由于和指令core
,我预计 systemd 在成功启动后也会再次启动它。core
Wants
Before
但这并没有发生。
什么做工作是在指令中手动再次启动它ExecStartPost
:
[Unit]
Description=Some Core Service
[Service]
Type=forking
ExecStart=/some/core/executable
ExecStartPre=+systemctl stop overwatch.service
ExecStartPost=+systemctl start overwatch.service
# ...
但我想知道是否有更好的方法。最好是推荐的描述性方式来表达我的要求,而不是(ab)使用启动前和启动后挂钩来手动停止和启动另一个服务。