Warum wartet mein systemd-Dienst nicht auf das Netzwerk?

10

Aufgrund dieser Frage und ihrer Antworten habe ich meiner Servicedatei Folgendes hinzugefügt:

Wants=network-online.target
After=docker.service network.target network-online.target

Ich bin auch gelaufen:

systemctl enable NetworkManager-wait-online.service
systemd-networkd-wait-online.service

Und dennoch schlägt meine ExecStartPreAufgabe, die verwendet wird git pull origin master, aufgrund eines scheinbaren Konnektivitätsproblems fehl.

Mar 22 16:17:21 COMPUTER git[1983]: ssh: Could not resolve hostname github.com: Name or service not known
Mar 22 16:17:21 COMPUTER git[1983]: fatal: Could not read from remote repository.

Vermisse ich etwas Offensichtliches? Gibt es einen anderen Dienst, auf den ich warten muss, um ihn nutzen zu können git pull? (Falls es relevant ist, verwende ich Ubuntu 16.10 und systemd 231.)

pdoherty926
quelle
Welche Distribution verwenden Sie? Es gibt keine Garantie dafür, dass die Netzwerkeinheiten Ihrer Distribution die richtigen Abhängigkeiten w / r / t aufweisen network-online.target. Möglicherweise müssen Sie Ihre Einheit After=NetworkManager.service(oder After=NetworkManager-wait-online.service) herstellen.
Larsks
@ Larsks Ubuntu 16.10
pdoherty926
Funktioniert der Dienst, wenn Sie ihn nach dem Start starten?
Centimane
@ Centimane Ja.
pdoherty926

Antworten:

6

Der erste Schritt besteht darin, festzustellen, ob Sie NetworkManageroder verwenden systemd-networkd. Aktivieren Sie wait-onlinefür die von Ihnen verwendete (vorausgesetzt systemd-networkdfür dieses Beispiel):

systemctl enable systemd-networkd-wait-online.service

Lassen Sie Ihren Dienst nach dem wait-onlineDienst beginnen:

[Unit]
...
After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service

(erfordert ist eine strengere Variante von wants, in diesem Fall scheint es, als ob Sie die harte Abhängigkeit wollen).

Dies sollte dazu führen, dass Ihr Dienst gestartet wird, nachdem das Netzwerk garantiert ist.


Alternativ (oder in Verbindung mit der vorherigen Lösung) können Sie den Dienst so konfigurieren, dass er neu gestartet wird, wenn er mithilfe des Restart=Flags fehlschlägt :

[Unit]
...
Restart=on-failure
RestartSec=5

https://www.freedesktop.org/software/systemd/man/systemd.service.html#Restart=

Dies ist möglicherweise die bessere Methode, da dadurch der Startvorgang nicht verlangsamt wird ( https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/#cutthecraphowdoimakenetwork.targetworkforme - die Verwendung wait-onlinekann die Startzeit erheblich verlangsamen) Wenn Sie sich Sorgen darüber machen, was der Dienst bei einem Ausfall tun könnte, wählen Sie Option 1 oder beides.

Centimane
quelle
1
Sollte irgendwo festgesteckt werden. Wirklich hilfreich, auch wenn 2 Jahre alt. Vielen Dank.
user1452962