web-dev-qa-db-ja.com

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
5
sphchow

私は次の出力を見て、この問題を解決しました。

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が利用可能になるまでサービスが開始されませんでした。

9
rex

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

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

2
sourcejedi

Systemdについては特に知りませんが、NetworkManagerを使用している場合は、スクリプトの上部にあるnm-onlineを使用して、ネットワークが稼働するまで待つことができます。

if nm-online; then 
    echo "Online"
    # do my stuff
else
    echo "Network error"
fi

デフォルトでは、ネットワーク接続がアクティブになるまで30秒待機し、アクティブな場合は0(true)を返し、そうでない場合はfalseを返します。

それは少なくともpingするよりは良いと思います。

0
Chad

Requires=network-online.targetを含めてみましたか? ArchとCentOSの両方のインストールには、デフォルトでこのターゲットがあります。これはターゲットであるため、サービスが1つだけ起動するのではなく、システムが起動プロセスの特定のマイルストーンに達したことを示しています。それでも解決しない場合は、ネットワーク接続が必要であることがわかっている別のサービスユニットと比較してみてください。

0
smokes2345