我有一个长期运行的 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
。但我一直无法弄清楚如何。
答案1
您需要check.service
是Type=oneshot
with RemainAfterExit=yes
,并且还需要是WantedBy=db.service
and 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.service
从check.service
.相反,你会check.service
显式运行sudo systemctl start db.service
当且仅当检查成功。
这样,check.service
手动启动时就不会存在需要运行的依赖项db.service
,但check.service
只有在检查成功时(大概是在启动时)才会自动启动数据库。