他のサービスが正常に実行されているときにsystemdサービスを実行しないでください

他のサービスが正常に実行されているときにsystemdサービスを実行しないでください

私のアプリケーションには2つのサービスがあります。

  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「ロールバック」操作が正常に完了したら、システムを自動的に再起動してみてください。

IMHO、両方のデバイスはRemainAfterExit=true必要ありません。 (少なくともロールバック側では)

[Install]他のセクションは失敗した場合にのみアクティブになる可能性があるため、ヘルスチェックには1つのセクションを含める必要があります。


ポスターのユースケースに関係なく、トピックのタイトルに正しく答えるには、次の手順を実行します。

  1. ConditionPathExists=!/some/path/filenameファイルが存在する場合に実行を防ぐには、「A」サービスで使用する必要があります。
  2. ExecStartPost=そして、そのサービス「B」が正常に終了したときに最初のサービス「A」が起動しないように、ディレクティブの他のサービス「B」に対応するファイルを作成します。

関連情報