Próbuję utworzyć usługę systemową na Debian Jessie. Potrzebuję go rozpocząć po network-online.target
osiągnięciu.
Problemem są network-online.target
pożary w tym samym czasie network.target
, kiedy moje interfejsy nie są jeszcze skonfigurowane, właśnie uruchomiłem zapytanie DHCP.
Wygląda na to, że ten problem jest specyficzny dla Debiana, ponieważ wykorzystuje starszą konfigurację sieci.
Jak obejść ten problem lub jak sprawić, by network-online.target
działał?
debian
systemd
systemd-networkd
10robinho
źródło
źródło
systemctl list-dependencies network-online.target
? Należy również pamiętać, żenetwork-online.target
może to nie oznaczać, że istnieje dostęp do Internetu. Zobacz tę stronę, aby uzyskać więcej informacji.network-online.target ● └─systemd-networkd-wait-online.service
brzmią : Przeczytałem już tę stronę, rozumiem tam podstawową koncepcję, ale nadal bardzo dziwne jest brak określonego punktu, w którym można uruchomić usługi krytyczne dla sieci. Przynajmniej może poczekać na prawidłowe przypisanie DHCP.network-online.target
zależy tylko odsystemd-networkd-wait-online.service
powiedzenia, że jest gotowy. To nie zależy od NetworkManagera, który mówi, że jest gotowy, ani też nie sprawdza, czyifup
wszystkie linki zostały pomyślnie wyświetlone (jeśli użyjesz tej metody do skonfigurowania sieci). Ubuntu, z drugiej strony, zależy odifup
i NetworkManager, ale nie dlasystemd-networkd-wait-online.
./etc/network/interfaces
systemowe.network
lub NetworkManager?network-online.target
inetwork.target
są uruchamiane zaraz poifup
. Używam domyślnej wersji Debiana, więc/etc/network/interfaces
z adresem dhcp. Wygląda na to, że networkd może być lepszym rozwiązaniem, ale nie jest łatwe do wdrożenia.Odpowiedzi:
Ponieważ używasz
/etc/network/interfaces
, potrzebujesz systemowej usługi do monitorowania statusu każdego interfejsu. Sprawdź, czy masz/lib/systemd/system/ifup-wait-all-auto.service
(zainstalowany przezifupdown
pakiet w Ubuntu 15.04). Jeśli nie, utwórz/etc/systemd/system/ifup-wait-all-auto.service
i wklej następujące elementy:Jest to plik serwisowy obecny w systemie Ubuntu 15.04, ale z
[Install]
dodaną sekcją, aby ułatwić trochę. Mam nadzieję, że zachowanieifup
w Ubuntu 15.04 jest takie samo jak zachowanieifup
w Debian Jessie. Jeśli nie, konieczna będzie modyfikacja (szczególnie w ostatnim wierszu).Następnie biegnij
sudo systemctl enable ifup-wait-all-auto.service
. Po ponownym uruchomieniu komputera powinieneś zobaczyć, żenetwork-online.target
osiągnięto go po uruchomieniu interfejsów (przynajmniej).źródło
ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'
. Zależy to odhostname
sprawdzenia, czy adres IP został przypisany.ifup-wait-all-auto.service
została upuszczona wifupdown
wersji0.8.5ubuntu1
: ”Drop ifup-wait-all-auto.service. Zostało to zaimplementowane bardziej elegancko poprzez bezpośrednie utworzenie network-online.target Wants = networking.service. “ [Uwaga! Właśnie wymyśliłem to na Raspbian Jessie: usuń WSZYSTKIE skomentowane linie w interfejsach sieciowych / etc / i będzie działać! Wydaje się, że to błąd analizowania =) W moim konkretnym przypadku zostawiłem komentarz
iface eth0 inet dhcp
i zapomniałem o tym eony temu, ale po aktualizacji do Raspbian Jessie i przebudowaniu jądra mam bardzo dziwne zachowanie: używał DHCP i odmówił wykonaj strojenie z / etc / network / interfaces. Więc usunąłem go z wszelkich komentarzy - tylko działające linie, uruchom ponownie - i to działa! NIE POTRZEBNE PATCHOWANIE / EDYCJA SKRYPTÓW!źródło
/etc/network/interfaces
pliku - uruchomi się, jeśli nadal będzie dostępny.Za https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ zalecanym sposobem uruchomić usługę PO sieci jest poziom jest użycie „ network-online.target ” w .service pliku:
Jednak po użyciu „ network-online.target ” i awarii mojej usługi, ponieważ sieć nie była w pełni wyrównana, odkryłem, że występuje błąd ( https://github.com/coreos/bugs/issues/1966 ): nie gwarantuje się być w 100% nieomylnym.
Rzeczywiście, gdy używane są narzędzia do dynamicznej konfiguracji sieci, takie jak „ NetworkManager ”, tak jak w tym przypadku, stan sieci nigdy nie może być w 100% precyzyjny ani przewidywalny. Najwyraźniej z linku opisującego błąd „ network-online.target ” może zachowywać się niekonsekwentnie w zależności od różnych aplikacji, z którymi jest używany.
Obejście :
Musisz przeanalizować kolejność uruchamiania usług i użyć takiej, która zaczyna się później niż „ network-online.target ”:
Jest to proces iteracyjny, polegający na stopniowym zmienianiu celów na usługi późniejsze i późniejsze, dopóki nie znajdziesz takiego, który zapewnia równy poziom sieci i rozpoczęcie usługi bez błędów. W moim przypadku musiałem nawet umieścić
sleep 10
w swoim skrypcie usługę SystemD.źródło
Kiedyś znalazłem odpowiedź na Github, która ją rozwiązała, ciągle próbując pingować serwer. Usługa jest kontynuowana tylko po wysłaniu polecenia ping:
Zastąpiłem
google.com
własnym serwerem, ponieważ mój główny skrypt musiał się połączyć z moim serwerem.źródło