我的应用程序有两项服务:
- healthcheck - 检查系统的运行状况并在验证失败时尝试重新启动。
- 回滚-当多次重新启动尝试未能通过健康检查时,它会回滚到以前的版本。
用于健康检查的单元文件如下所示:
[Unit]
Description=greenboot Health Checks Runner
Before=boot-complete.target
OnFailureJobMode=fail
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/libexec/greenboot/greenboot health-check
Restart=no
[Install]
RequiredBy=boot-complete.target
WantedBy=multi-user.target
和回滚
[Unit]
Description=Greenboot rollback
DefaultDependencies=no
Before=multi-user.target ostree-finalize-staged.service greenboot.service
Wants=local-fs.target
After=local-fs.target
ConditionNeedsUpdate=|/etc
ConditionNeedsUpdate=|/var
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/libexec/greenboot/greenboot rollback
Restart=no
[Install]
WantedBy=multi-user.target
回滚还有其他一组触发条件,包括 grub 变量,如何确保当回滚以退出代码 0 运行时,运行状况检查服务不会运行。
答案1
尝试使用OnFailure=
健康检查在失败时激活回滚,并SuccessAction=reboot
在“回滚”操作成功完成后自动重新启动系统。
恕我直言,在这两个单位中,RemainAfterExit=true
都是不需要的。
(至少在回滚方面)
只有健康检查应该包含一个[Install]
部分,因为另一个部分只能在失败时激活......
要正确回答主题标题,而不考虑海报的用例:
- 您应该在服务“A”中使用
ConditionPathExists=!/some/path/filename
, 来防止该文件存在时运行它。 - 并在指令中的另一个服务“B”中创建该文件
ExecStartPost=
,以防止当该服务“B”成功退出时启动第一个服务“A”。