GNU/Linux >> Linux の 問題 >  >> Linux

ネットワーキングの開始後にスクリプトを実行させますか?

私はsystemdに比較的慣れておらず、そのアーキテクチャを学んでいます。

現在、カスタムシェルスクリプトを実行する方法を理解しようとしています。このスクリプトはに実行する必要があります ネットワーク層が起動しました。

systemdとnetctlを使用してArchを実行しています。

テストするために、ip addr list > /tmp/ip.txtを実行するだけの簡単なスクリプトを作成しました。 。このスクリプト用に次のサービスファイルを作成しました。

(/etc/systemd/system/test.service)
[Unit]
Description=test service

[Service]
ExecStart=/root/test.script

[Install]
WantedBy=multi-user.target

次に、

を使用してスクリプトを有効にしました
systemctl enable test

再起動すると、スクリプトは実際に実行されますが、ネットワークが開始される前に実行されます。つまり、ip.txtの出力 プライマリインターフェイスに割り当てられたIPv4アドレスを表示しません。ログインするまでに、IPv4アドレスが実際に割り当てられ、ネットワークが稼働しています。

WantedByをいじることで、スクリプトが実行されるポイントを変更できると思います。 パラメータですが、その方法がわかりません。

誰かが私を正しい方向に向けることができますか?

承認された回答:

systemdネットワーク構成の依存関係について

systemdのユニットの順序に影響を与えるのは非常に簡単です。一方、完成したユニットが何を保証するかについては注意する必要があります。

サービスを構成する

現在のシステムでは、
network.targetの後に注文する 実際の構成があることを保証するのではなく、ネットワークサービスが開始されたことを保証するだけです。 network-online.targetの後に注文する必要があります それを達成するためにそれを引き込みます。

[Unit]
Wants=network-online.target
After=network-online.target

古いシステムとの互換性のために、network.targetの後に注文する必要がある場合もあります。

[Unit]
Wants=network-online.target
After=network.target network-online.target

これは、サービスのユニットファイルとsystemd用です。

現在のバージョンのソフトウェアでの実装

次に、network-online.targetを確認する必要があります 期待どおりに機能します(または、少なくともnetwork.targetを使用できます) 。

NetworkManagerの現在のバージョン NetworkManager-wait-online.serviceを提供します これはnetwork-online.targetによって引き込まれます したがって、あなたのサービスによって。この特別なサービスにより、開始するように構成されたすべての接続が自動的に成功、失敗、またはタイムアウトするまでサービスが待機します。

systemd-networkdの現在のバージョン すべてのデバイスが要求どおりに構成されるまで、サービスをブロックします。現在、起動時(より具体的には、 `systemd-networkd.serviceの起動時)に適用される構成のみをサポートしているという点で、より簡単です。

完全を期すために、/etc/init.d/network 現在のバージョンのsystemdで解釈されるように、Fedoraのサービスはnetwork.targetをブロックします したがって、network-online.targetを間接的にブロックします とあなたのサービス。これは、スクリプトベースの実装の例です。

デーモンベースかスクリプトベースかに関係なく、実装が上記のネットワーク管理サービスの1つとして動作する場合、ネットワーク構成が正常に完了するか、正当な理由で失敗するか、妥当な時間後にタイムアウトになるまで、サービスの開始が遅れます。完了するフレーム。

関連:パス名に特定の順序なしで複数の単語が含まれているファイルを検索しますか?

netctl かどうかを確認することをお勧めします 同じように機能し、その情報はこの回答への貴重な追加になります。

古いバージョンのソフトウェアでの実装

これがうまく機能しない、十分に古いバージョンのsystemdは表示されないと思います。ただし、少なくともnetwork-online.target 存在し、network.targetの後に注文されます 。

以前はNetworkManager 少なくとも1つの接続が適用されることが保証されているだけです。それが機能するためにも、NetworkManager-wait-online.serviceを有効にする必要があります 明示的に。これはFedoraで長い間修正されてきましたが、最近アップストリームに適用されたばかりです。

systemctl enable NetworkManager-wait-online.service

network.targetおよびnetwork-online.targetの実装に関する注意

ソフトウェアをNetworkManager.serviceに依存させる必要はありません。 またはNetworkManager-wait-online.service その他の特定のサービスもありません。代わりに、すべてのネットワーク管理サービスは、network.targetの前に自分自身を注文する必要があります オプションでnetwork-online.target

単純なスクリプトベースのネットワーク管理サービスは、終了する前にネットワーク構成を完了し、network.targetの前に自分自身を注文する必要があります したがって、network-online.targetの前に間接的に 。

[Unit]
Before=network.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

デーモンベースのネットワーク管理サービスも、network.targetの前に自分自身を注文する必要があります あまり役に立ちませんが。

[Unit]
Before=network.target

[Service]
Type=simple
ExecStart=...

デーモンが終了するのを待つサービスは、特定のサービスの後、network-online.targetの前に自分自身を注文する必要があります 。 Requisiteを使用する必要があります デーモンサービスで、それぞれのネットワーク管理サービスが使用されていない場合はすぐに失敗するようにします。

[Unit]
Requisite=...
After=...
Before=network-online.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

パッケージは、wantsで待機中のサービスへのシンボリックリンクをインストールする必要があります network-online.targetのディレクトリ 構成されたネットワークを待機するサービスによってプルされるようにします。

ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/

関連ドキュメント

  • http://www.freedesktop.org/software/systemd/man/systemd.special.html#network-online.target
  • http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

最終メモ

質問されたときの質問に答えるだけでなく、アップストリームおよびLinuxディストリビューションの状況を改善し、元の質問を書いたときよりも良い答えを出すことができるようになったことを願っています。 。


Linux
  1. Systemdが開始直後にサービスを停止するのはなぜですか?

  2. URLからbashスクリプトを実行

  3. crontab 経由で Python スクリプトを実行する

  1. bash スクリプトをデーモンとして実行する

  2. ゲストが再起動するたびに Vagrant がスクリプトまたはコマンドを実行する (vagrant up)

  3. bash スクリプトを実行するには?

  1. Linux – Fsckスクリプトの場所?

  2. シャットダウン直前にsystemdでスクリプトを実行する方法は?

  3. Systemd :シャットダウン時のみ (再起動時ではなく) にスクリプトを実行する方法