インターネットへのアクセスが必要なユーザーランド バックアップ スクリプトで、同じ問題が発生していました。 ~/.config/systemd/user/wait-for-network.service を追加して解決しました google.com を ping するだけです 到達可能になるまで:
[Unit]
Description=Ping a server on the internet until it becomes reachable
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'while ! ping -c1 google.com; do sleep 1; done'
TimeoutStartSec=60s
次に、バックアップ スクリプトを次のように依存させました。
[Unit]
Description=...
Requires=wait-for-network.service
After=wait-for-network.service
これは、 NetworkManager を使用するかどうかに関係なく機能します または接続を確立するための他の手段。
network.target は忘れてください . man systemd.special 言います:
network.target systemd automatically adds dependencies of type After for this target unit to all SysV init script service units with an LSB header referring to the $network facility.
したがって、このターゲットは主に SysV init スクリプトの互換性ハックです。
ネットワーク接続が NetworkManager によって処理されていると仮定すると、NetworkManager.service であるため、このターゲットに依存するのは当然のことです。 Before=network.target を定義 .ただし、これは NetworkManager が開始されたことを意味するだけであり、ネットワーク接続が実際に確立されたことを意味するわけではありません。これにはしばらく時間がかかる場合があり (dhcp ラウンドトリップ、wifi ハンドシェイクなど)、これは完全に NetworkManager の仕事です。少なくとも私のシステム (F18) には NetworkManager-wait-online というサービスがあります . nm-online を使用します アクティブな接続が確立されるまでブロックするユーティリティ プログラム。 Require, Before してみてください ユニット定義でそれを使用するか、そのツールを単独で使用してください。