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