Systemd は、サービスを実行する前にネットワーク インターフェイスが起動するのを待ちます。

Systemd は、サービスを実行する前にネットワーク インターフェイスが起動するのを待ちます。

systemdについていくつかの質問があります。ネットワークインタフェースが動作している場合、常にスクリプトを実行することはできません。以下のようにRequiresとAfterを試しましたが、ネットワークが起動するのを待っているものと一致しません。正しいサービスを使用して正しく実装していますか?この問題を解決するために、今は非常に非効率的でハッキーなping確認ループを実行しています。どんな提案でもいいでしょう。ありがとうございます!

[Unit]
Description=PBU installer
Requires=network-online.service
After=network-online.service

[Service]
Type=oneshot
ExecStart=/home/pbu/current/scripts/pbu-unpack.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

答え1

次の出力を見て問題を解決しました。

systemctl list-units --no-pager

これは、すべてのネットワーク機器のように私が考えていなかった多くのデバイスを示しました!

sys-devices-virtual-net-lan0.device loaded active plugged   /sys/devices/virtual/net/lan

だから私は追加しました

BindsTo=sys-devices-virtual-net-lan0.device
After=sys-devices-virtual-net-lan0.device

私の組織サービスファイルに追加すると、lan0が利用可能になるまで私のサービスは開始されません。

答え2

これは間違っているようです。正しい名前はnetwork-online.target存在 network-online.serviceしません(Fedora 26でテスト済み)。

https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

答え3

古いスレッドを蘇らせると、何人かの人々が役に立つと思うかもしれません。 RPiのnftablesでワイヤレスインターフェイスを使用する必要がありますが、時々接続するのに時間がかかります。私は以下を追加しました:

ExecStartPre=timeout 60s bash -c 'until ip a s dev wlan0; do sleep 1; done'

nftables.serviceデバイスに移動して動作させます。ExecPreStart=sleep 60少し愚かなように見えることに加えて、ここの他の解決策のどれも安定して動作しません。インターフェイスが表示されるとループは終了しますが、until私のnftルールにはIPが必要ないため、まだIPがありません。パイプを渡すと、grep '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\/[0-9]\{1,2\}'IPV4アドレスを待ちます。

答え4

を含めてみましたかRequires=network-online.target? My ArchとCentOSのインストールにはデフォルトでこのターゲットがあります。これは目標であるため、単に単一のサービスを開始するのではなく、起動時にシステムが特定のマイルストーンに達したことを示します。それでも問題が解決しない場合は、ネットワーク接続が必要な他のサービスデバイスと比較してみてください。

関連情報