私は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ディストリビューションの状況を改善し、元の質問を書いたときよりも良い答えを出すことができるようになったことを願っています。 。