特定のサービスを特定のインターフェースに依存させるにはどうすればよいですか?

特定のサービスを特定のインターフェースに依存させるにはどうすればよいですか?

SystemD では、特定のサービスが特定のネットワーク インターフェイスの稼働に依存できるようにするにはどうすればよいでしょうか?

libvirtdたとえば、別のインターフェース経由でネットワーク アクセスが利用できる場合でも、起動する前に SAN/NAS へのアクセスを待機する必要がある 802.1ad ボンド インターフェースがあるとします。またはsshfs、VPN 接続に依存して自動的に起動 (および自動的に解除) するマウントがあるとします。

ネットワーク インターフェイスのきめ細かい依存関係を処理する慣用的な方法は何ですか?

現在、Ubuntu と CentOS7 で NetworkManager を使用していますが、ネットワーク状態を管理するための他のプラットフォームに適したメカニズムも検討しています。

答え1

実際には標準的な組み込み方法はないと思いますが、 で活用できるものがいくつかありますsystemd

実行開始前=

それぞれ ExecStart= のコマンドの前に実行される追加のコマンドです。構文は ExecStart= と同じですが、複数のコマンド ラインが許可され、コマンドが次々にシリアルに実行される点が異なります。

これらのコマンドのいずれか (接頭辞「-」が付いていない) が失敗した場合、残りのコマンドは実行されず、ユニットは失敗したとみなされます。

再起動=失敗時

サービス プロセスが終了したとき、強制終了されたとき、またはタイムアウトに達したときにサービスを再起動するかどうかを構成します。

on-failure に設定すると、プロセスがゼロ以外の終了コードで終了したとき、シグナルによって終了したとき (コア ダンプを含むが、前述の 4 つのシグナルは除く)、操作 (サービスの再ロードなど) がタイムアウトしたとき、および構成されたウォッチドッグ タイムアウトがトリガーされたときに、サービスが再起動されます。


コマンドは、ゼロ以外の終了コードを返すと失敗したとみなされます。そのため、ExecStartPreインターフェイスが稼働していることを証明する値を に設定することで、サービスがそれを必要とすることを確認できます。

いくつかの例:

ExecStartPre=/usr/bin/ping -c 1 ${SAN_IP}

ExecStartPre=/usr/sbin/iscsiadm -m session

個人的には、このiscsiadmバリアントはあなたのユースケースに合っていると思います。iscsi 接続がある場合、戻り値は 0 で、それ以外の場合は 21 を返します (サービスが失敗する原因になります)。このpingバリアントはさまざまな用途に使用できますが、ほとんどの場合、ネットワーク ステータスを確認するにはより適切なコマンドを見つける必要があると思います。ssh別のホストで確認するためのキーが設定されている場合は、使用してみることもできます。

ポイントは、ExecStartPre任意のコマンドに基づいてサービスを失敗させることができるということです。使用するコマンドが、必要なときにゼロ以外の終了コードを返すことを確認してください(たとえば、cat空のファイルを実行すると 0 が返されますが、cat存在しないファイルを実行すると 1 が返されます)。


少し考えて、質問者のコメントを踏まえて、私はこう言いたい。最高サービスに対して複雑な条件を定義する 1 つの方法は、そのサービスが依存する別のサービスを作成することです。

としてステータスを確認するコマンドを使用する新しいサービスを作成しますExecStart。それに を指定しますRestart=on-failure。次に、元のサービスを作成しRequireAfterそれを使用します。

上で使用した例ExecStartPreは、サービスが適切に実行されるように設定するという本来の目的を少しゆがめています。それでも適用可能であり、知識もまだ役立つため、そのまま残しておきます。

関連情報