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
私は次の出力を見て、この問題を解決しました。
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が利用可能になるまでサービスが開始されませんでした。
これは間違っているようです。正しい名前はnetwork-online.target
。 network-online.service
は存在しません(Fedora 26でテスト済み)。
https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
Systemdについては特に知りませんが、NetworkManagerを使用している場合は、スクリプトの上部にあるnm-online
を使用して、ネットワークが稼働するまで待つことができます。
if nm-online; then
echo "Online"
# do my stuff
else
echo "Network error"
fi
デフォルトでは、ネットワーク接続がアクティブになるまで30秒待機し、アクティブな場合は0(true)を返し、そうでない場合はfalseを返します。
それは少なくともpingするよりは良いと思います。
Requires=network-online.target
を含めてみましたか? ArchとCentOSの両方のインストールには、デフォルトでこのターゲットがあります。これはターゲットであるため、サービスが1つだけ起動するのではなく、システムが起動プロセスの特定のマイルストーンに達したことを示しています。それでも解決しない場合は、ネットワーク接続が必要であることがわかっている別のサービスユニットと比較してみてください。