如何仅在启动时运行服务依赖项?

如何仅在启动时运行服务依赖项?

我有一个长期运行的 systemd 服务,我们称之为db.service。它可以在系统启动时启动,但也可以手动重新启动。

我还有一个oneshot服务(我们称之为)check.service,可以对数据库文件执行完整性检查。

check.service应在系统启动时运行,并且在启动期间db.service如果失败则不应启动check.service

但!这里有一个警告:当使用 手动重述check.service时不应运行。 即使启动失败,也应该可以手动启动。db.servicesystemctl restart db.servicedb.servicecheck.service

问题

有没有办法使用 systemd 服务来实现这一点?

想法和观察

  • 我想我可以通过使用RequiredBy=db.servicein来实现这一点check.service。但启动check.service时仍然会触发。db.service

  • 也许可以通过创建第三个服务 来解决该问题,db-boot.service该服务依赖于 bootdb.servicecheck.service。但我一直无法弄清楚如何。

答案1

您需要check.serviceType=oneshotwith RemainAfterExit=yes,并且还需要是WantedBy=db.serviceand orderedBefore=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.servicecheck.service.相反,你会check.service显式运行sudo systemctl start db.service 当且仅当检查成功。

这样,check.service手动启动时就不会存在需要运行的依赖项db.service,但check.service只有在检查成功时(大概是在启动时)才会自动启动数据库。

相关内容