当另一个服务成功运行时不要运行 systemd 服务

当另一个服务成功运行时不要运行 systemd 服务

我的应用程序有两项服务:

  1. healthcheck - 检查系统的运行状况并在验证失败时尝试重新启动。
  2. 回滚-当多次重新启动尝试未能通过健康检查时,它会回滚到以前的版本。

用于健康检查的单元文件如下所示:

[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]部分,因为另一个部分只能在失败时激活......


要正确回答主题标题,而不考虑海报的用例:

  1. 您应该在服务“A”中使用ConditionPathExists=!/some/path/filename, 来防止该文件存在时运行它。
  2. 并在指令中的另一个服务“B”中创建该文件ExecStartPost=,以防止当该服务“B”成功退出时启动第一个服务“A”。

相关内容