Ich versuche, einen Systemdienst für Debian Jessie zu erstellen. Ich brauche es, um zu starten, nachdem network-online.target
es erreicht ist.
Das Problem ist, dass network-online.target
gleichzeitig mit network.target
und zu diesem Zeitpunkt meine Schnittstellen noch nicht konfiguriert sind, nur die DHCP-Abfrage gestartet wurde.
Es sieht so aus, als ob dieses Problem spezifisch für Debian ist, da es eine alte Netzwerkkonfiguration verwendet.
Wie kann man dieses Problem umgehen oder network-online.target
arbeiten lassen?
debian
systemd
systemd-networkd
10robinho
quelle
quelle
systemctl list-dependencies network-online.target
? Beachten Sie auch, dass diesnetwork-online.target
möglicherweise nicht zwingend bedeutet, dass ein Internetzugang vorhanden ist. Weitere Informationen finden Sie auf dieser Seite.network-online.target ● └─systemd-networkd-wait-online.service
Ich habe diese Seite bereits gelesen, ich verstehe das Grundkonzept dort, aber es ist immer noch sehr seltsam, keinen definierten Punkt zu haben, an dem netzwerkkritische Dienste starten können. Zumindest könnte es auf eine ordnungsgemäße DHCP-Zuweisung warten.network-online.target
nur von demsystemd-networkd-wait-online.service
Spruch abhängt , dass es fertig ist. Es hängt nicht davon ab, ob NetworkManager sagt, dass es bereit ist, oder ob überprüft wird, obifup
alle Verknüpfungen erfolgreich hergestellt wurden (wenn Sie diese Methode zum Konfigurieren Ihres Netzwerks verwenden). Ubuntu hingegen ist abhängig vonifup
und NetworkManager, jedoch nicht fürsystemd-networkd-wait-online.
./etc/network/interfaces
:,.network
Systemdateien oder NetworkManager?network-online.target
undnetwork.target
werden gleich danach ausgelöstifup
. Ich verwende Debian-Standard, also/etc/network/interfaces
mit DHCP-Adresse. Es sieht so aus, als ob networkd eine bessere Lösung sein könnte, aber die Implementierung ist nicht einfach.Antworten:
Da Sie verwenden
/etc/network/interfaces
, benötigen Sie einen System-Service, um den Status jeder Schnittstelle zu überwachen. Überprüfen Sie, ob dies der Fall ist/lib/systemd/system/ifup-wait-all-auto.service
(installiert durch dasifupdown
Paket in Ubuntu 15.04). Wenn nicht, erstellen Sie/etc/systemd/system/ifup-wait-all-auto.service
Folgendes und fügen Sie es ein:Dies ist die Service-Datei, wie sie auf einem Ubuntu 15.04-System vorhanden ist, jedoch mit dem
[Install]
Abschnitt, der hinzugefügt wurde, um die Dinge ein wenig einfacher zu machen. Ich hoffe, dass das Verhaltenifup
in Ubuntu 15.04 dem Verhaltenifup
in Debian Jessie entspricht. Andernfalls sind einige Änderungen erforderlich (insbesondere bei der letzten Zeile).Dann renne
sudo systemctl enable ifup-wait-all-auto.service
. Nach dem Neustart Ihres Computers sollten Sie feststellen, dass dernetwork-online.target
nach dem Aufrufen der Schnittstellen erreicht ist (zumindest).quelle
ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'
. Es hängt davon abhostname
, ob eine IP-Adresse zugewiesen wurde.ifup-wait-all-auto.service
wurde in derifupdown
version fallen gelassen0.8.5ubuntu1
: ”drop ifup-wait-all-auto.service. Dies wurde eleganter implementiert, indem network-online.target Wants = networking.service direktBeachtung! Fand es einfach auf einem Raspbian Jessie heraus: Entferne ALLE kommentierten Zeilen in / etc / network interfaces und es wird funktionieren! Es scheint ein Parsing-Fehler zu sein =) In meinem speziellen Fall habe ich
iface eth0 inet dhcp
es vor Äonen kommentiert und einfach vergessen, aber nach dem Upgrade auf Raspbian Jessie und der Neuerstellung eines Kernels habe ich ein sehr merkwürdiges Verhalten: Es hat DHCP verwendet und dies abgelehnt Tuning aus / etc / network / interfaces. Also habe ich alle Kommentare entfernt - nur funktionierende Zeilen, Neustart - und es funktioniert! KEIN SCRIPT PATCHING / EDITING NOTWENDIG!quelle
/etc/network/interfaces
Datei ein - es wird gestartet, wenn es noch da ist.Laut https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ ist die Verwendung von " network-online.target " in der .service- Datei die empfohlene Methode zum Starten eines Dienstes, nachdem die Netzwerkebene erreicht ist :
Nachdem ich jedoch " network-online.target " verwendet hatte und mein Dienst fehlgeschlagen war, weil das Netzwerk nicht voll funktionsfähig war, stellte ich fest, dass ein Fehler ( https://github.com/coreos/bugs/issues/1966 ) vorliegt: dies kann nicht garantiert werden 100% unfehlbar sein.
Wenn dynamische Netzwerkkonfigurationstools wie " NetworkManager " wie in diesem Fall verwendet werden, kann der Netzwerkstatus niemals 100% genau oder vorhersehbar sein. Anscheinend kann sich " network-online.target " von dem Link, der den Fehler beschreibt, abhängig von den verschiedenen Anwendungen, mit denen es verwendet wird, inkonsistent verhalten.
Problemumgehung :
Sie müssen die Startreihenfolge der Dienste analysieren und einen Dienst verwenden, der später als " network-online.target " startet :
Dies ist ein iterativer Prozess, bei dem die Ziele schrittweise auf spätere und spätere Dienste geändert werden, bis Sie denjenigen finden, der sicherstellt, dass das Netzwerk auf einem Level ist und Ihr Dienst fehlerfrei gestartet wird. In meinem eigenen Fall musste ich sogar einen
sleep 10
in meinem Skript aufgerufenen SystemD-Dienst einstellen.quelle
Ich habe einmal eine Antwort auf Github gefunden , die es löste, indem ich ständig versuchte, einen Server zu pingen. Erst wenn der Ping eingeht, wird der Dienst fortgesetzt:
Ich habe durch
google.com
meinen eigenen Server ersetzt, weil mein Hauptskript eine Verbindung zu meinem Server herstellen musste.quelle