我有一个长期运行的 systemd 服务,我们称之为db.service
. 它可以在系统启动时启动,但也可以手动重新启动。
我还有一个oneshot
服务,我们称之为它check.service
,它对数据库文件执行完整性检查。
check.service
应该在系统启动时运行,并且在启动过程中如果失败db.service
则不应启动。check.service
但!这里是警告:当使用手动重述check.service
时不应该运行。 即使启动失败,也应该可以手动启动。db.service
systemctl restart db.service
db.service
check.service
问题
有没有办法使用 systemd 服务来实现这一点?
想法和观察
我虽然可以通过使用
RequiredBy=db.service
in来实现这一点check.service
。但这仍然会在启动check.service
时触发db.service
。也许可以通过创建第三个服务 以某种方式解决该问题
db-boot.service
,该服务依赖于 bootdb.service
和check.service
. 但我一直无法弄清楚如何。
你需要
check.service
是Type=oneshot
withRemainAfterExit=yes
,它也需要是WantedBy=db.service
and 有序的Before=db.service
然后在启动时(或在数据库第一次启动之前,如果数据库未配置为在启动时启动),
check.service
运行完成并保持active (exited)
状态。所以当db.service
重新启动时,check.service
已经处于活动状态并且满足依赖关系,所以check.service
不会重新启动。使用此设置,如果
check.service
启动失败,db.service
将不会启动(但由于使用Want
依赖项而不是Require
,系统的其余部分将正常启动,而不是进入紧急模式)。如果db.service
再手动启动,则需要check.service
先运行一次成功。check.service
运行成功后,db.service
即可随意启停。如果
db.service
需要能够在check.service
失败时手动启动,那么您可能想要配置db.service
为根本不自动启动(即systemctl disable db.service
),并删除WantedBy=db.service
fromcheck.service
。相反,当且仅当检查成功时,您才会check.service
显式运行。sudo systemctl start db.service
这样,手动启动时将不需要
check.service
运行依赖项,但只有在检查成功时才会自动启动数据库(大概在启动时)。db.service
check.service