システムサービスが他のサービスの状態を「追従」させる方法は?

システムサービスが他のサービスの状態を「追従」させる方法は?

systemd-networkdを使用して「仮想」ネットワークインターフェイスを設定しました。デフォルトでは、インターフェイスは「ダウン」状態のままです。

そのインターフェイスのアドレスにバインドするアプリケーションを実行するサービス単位があります(インターフェイスがダウンしてもバインドできるように非ローカルバインディングを使用)。サービスが実行されている場合にのみ、ネットワークインターフェイスは「動作」状態である必要があります。

私が望む結果は、サービスが再起動またはクラッシュして回復できない場合、インターフェイスが「ダウン」状態のままで、システムのルーティングデーモン(OSPFを使用するBird2)がそのアドレスのルート広告を停止することです。サービスは利用可能な他のインスタンスにルーティングされます。

と を使用して "ip link set up/down" または "networkctl up/down" コマンドを実行できますが、実際にはExecStartPostこれExecStopPostが最初の試みですが、サービスの単位ファイルは非常に厳しいサンドボックス環境で実行されます。ユーザーなので、これらのコマンドはCAP_NET_ADMINがない環境で実行されるため、実行できません。サービス単位ファイルの例は次のとおりです。ここ

また、これらのコマンドを実行するために別々のサービスを作成してみました。このサービスは「ルート」としてうまく動作し、このように制限されません。しかし、2番目のサービスの依存関係仕様が発生する組み合わせは見つかりませんでした。フォローする最初のサービス状態です。

サービス B とAfter=サービスBindsTo=A を指す場合、システムの起動中にサービス A の後にサービス B が正しく開始されます。サービスAが停止すると、サービスBも停止する。 systemd がサービス A を再起動すると、サービス B も再起動されます。

ただし、Aサービスが停止して再起動すると、サービスBはいいえここです。

私が考えることができる唯一の他のオプションは、2つのサービスを結合する新しいターゲットを作成し、サービスAを手動で開始できないように制限することです。このようにして、管理者にサービスではなくターゲットを起動する必要があることを警告します。 。ただし、この新しいターゲットを自動的に依存させる方法は明確ではありませんmulti-user.target

答え1

さて、私は他の答えのビットを使ってこれが私が終わったものです。

システムバージョン248以下の場合

anycast-dns.target(エニーキャストDNSターゲット):

[Unit]
Description=Manage anycast DNS resolver and its network link

[Install]
WantedBy=multi-user.target

dns-link-manager.service:

[Unit]
BindsTo=pdns-recursor.service
After=pdns-recursor.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/networkctl up dns
ExecStop=/usr/bin/networkctl down dns

[Install]
WantedBy=anycast-dns.target

pdns-recursor.service.d/anycast-dns.conf:

[Unit]
RefuseManualStart=yes

[Install]
WantedBy=
RequiredBy=anycast-dns.target

systemctl enableそれらのそれぞれのために走りなさい。

これにより所望の結果が得られた。

  • 起動時にanycast-dns.targetはpdns-recursor.serviceを起動します。成功すると、dns-link-manager.serviceはネットワークリンクを開きます。

  • pdns-recursor.serviceが停止すると(手動またはクラッシュして再起動できません)、dns-link-manager.serviceはネットワークリンクを切断します。

  • 管理者はpdns-recursor.serviceを手動で起動(または再起動)することはできず、ネットワークリンクも機能していることを確認するためにanycast-dns.targetをプロキシで起動する必要があります。

システムバージョン249以降

dns-link-manager.service:

[Unit]
Requisite=pdns-recursor.service
After=pdns-recursor.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/networkctl up dns
ExecStop=/usr/bin/networkctl down dns

pdns-recursor.service.d/anycast-dns.conf:

[Unit]
Upholds=dns-link-manager.service
PropagatesStopTo=dns-link-manager.service

これにより所望の結果が得られた。

  • 起動すると、multi-user.targetはpdns-recursor.serviceを起動します。成功すると、dns-link-manager.serviceはネットワークリンクを開きます(依存関係のためUpholds)。

  • pdns-recursor.serviceが停止した場合(手動でまたはクラッシュして再起動できない)、dns-link-manager.serviceはネットワークリンクを切断します(依存関係のためPropagatesStopTo)。

  • pdns-recursor.serviceが実行されていない場合、管理者はdns-link-manager.serviceを手動で起動できません(この場合、dns-link-manager.serviceはすでに実行中です)。

関連情報