私は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
方法がわかりません。
誰もが正しい方向に私を指すことができますか?
ベストアンサー1
システムネットワーク構成の依存関係について
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
これはあなたのサービスとシステムの単位ファイルです。
現在のバージョンのソフトウェアの実装
これで、期待どおりに機能していることを確認する必要がありますnetwork-online.target
(または少なくとも利用可能ですnetwork.target
)。
現在のバージョンネットワーク管理者あなたのサービスに興味を持ってNetworkManager-wait-online.service
いる何かを提供してください。network-online.target
この特別なサービスは、自動的に開始するように設定されたすべての接続が成功、失敗、またはタイムアウトするまでサービスが待機することを保証します。
現在のバージョンシステムネットワークすべてのデバイスが必要に応じて設定されるまで、サービスをブロックします。現時点では、起動時に適用される設定(より具体的には「systemd-networkd.serviceの開始時間」)のみをサポートしているため、簡単です。
完全性のために、/etc/init.d/network
Fedoraのサービス(現在のsystemdとして解釈されている)はブロックし、間接network.target
的にnetwork-online.target
サービスをブロックします。これはスクリプトベースの実装の例です。
実装(デーモンベースでもスクリプトベースでも)が上記のネットワーク管理サービスの1つとして機能している場合、ネットワーク構成が正常に完了するか、合理的な理由で失敗するか、タイムアウトフレームが経過するまでサービスの開始が遅れます。完了するのに適した時間がかかります。
次の点を確認したい場合があります。ネットワーク制御同じ方法で作業すると、この情報はこの回答に貴重な追加情報になります。
以前のバージョンのソフトウェアで実装
私はそれがうまく動作するのに十分な古いバージョンのsystemdを見ることができないと思います。ただし、少なくともnetwork-online.target
存在するか、後でソートされるかを確認できますnetwork.target
。
前にネットワーク管理者少なくとも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ディストリビューションの状況を改善し、元の質問を書いたときよりも今より良い答えを提供できることを願っています。