Měl jsem stejný problém se skriptem zálohování uživatelské země, který potřebuje přístup k internetu. Vyřešil jsem to přidáním ~/.config/systemd/user/wait-for-network.service
to jen pingne google.com
dokud nebude dosažitelná:
[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
Pak jsem na tom nechal záviset můj záložní skript takto:
[Unit]
Description=...
Requires=wait-for-network.service
After=wait-for-network.service
Funguje to bez ohledu na to, zda používáte NetworkManager
nebo nějaký jiný způsob navázání spojení.
Zapomeňte na network.target
. man systemd.special
říká:
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.
Takže tento cíl je primárně hack na kompatibilitu pro SysV init skripty.
Za předpokladu, že vaše síťové připojení zpracovává NetworkManager, měli jste samozřejmě právo spoléhat se na tento cíl, protože NetworkManager.service
definuje Before=network.target
. To však znamená pouze to, že byl spuštěn NetworkManager, nikoli to, že je skutečně navázáno síťové připojení. To může chvíli trvat (dhcp zpáteční cesty, wifi handshake atd.) a je to výhradně záležitostí NetworkManageru. Alespoň na mém systému (F18) existuje služba s názvem NetworkManager-wait-online
. Používá nm-online
obslužný program zablokovat, dokud nebude navázáno aktivní připojení. Zkuste Require, Before
v definici jednotky nebo použijte tento nástroj samostatně.