Systemd: jak uruchomić usługę systemową po pełnym podłączeniu sieci?

12

tło

Piszę prosty skrypt do uruchomienia w Raspbain na Raspberry Pi 2, wystarczy włączyć diodę LED, aby wskazać, że jestem gotowy na połączenie z SSH z mojego komputera stacjonarnego.

Skrypt nie jest tutaj ważny, tylko wspomnieć, że ponieważ używam kontroli częstotliwości, więc skrypt działa w nieskończonej pętli, aby często włączać i wyłączać diodę LED. To jest przykład prostej usługi. Jednak przynajmniej zaakceptowana odpowiedź na to pytanie radzi mi ustawić typ na bezczynny. Tak wygląda mój plik usługi

[Unit]
Description=Turn on LED after SSH is ready

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
Wants=network-online.target
After=network-online.target

Efekt

Usługa działa zgodnie z oczekiwaniami. Zauważyłem jednak, że kiedy zaczynam szpachlowanie na komputerze stacjonarnym zaraz po włączeniu diody LED, monit logowania nie pojawia się natychmiast. Więc sprawdziłem z

$ systemd-analyze plot > output.svg

Wynik pokazuje

wprowadź opis zdjęcia tutaj

Pytanie

Wygląda na to, że moje usługi zaczynają się później network-online.target, co jest tutaj nie tak i jak mogę to naprawić?

Silnik Ziemi
źródło

Odpowiedzi:

12

Gdy pojawia się pytanie dotyczące dyrektywy systemowej, możesz użyć, man systemd.directivesaby znaleźć miejsce, w którym jest ona udokumentowana. W tym przypadku pokazuje, że After=jest to udokumentowane man systemd.unit.

W tym pliku pokazuje, że After=dyrektywa jest wymieniona w „OPCJACH SEKCJI [JEDNOSTKI]”, wskazując, że należy ona do [Unit]sekcji pliku.

Ta sama dokumentacja dokumentuje również opcje sekcji [ZAINSTALUJ] i After=nie jest tam wymieniona.

Krótko mówiąc, twoja After=dyrektywa znajdowała się w niewłaściwej lokalizacji pliku jednostki, więc nie działała, dopóki nie przeniesiesz jej do właściwej lokalizacji.

Mark Stosberg
źródło
Dla jasności, w tym przypadku „[Jednostka]” to „[Usługa]”, ponieważ jest to plik usługi.
faho,
Kopiowalna odpowiedź z poprawkami byłaby znacznie lepsza!
GerardJP
@GerardJP Lepiej nauczyć mężczyznę łowić ryby niż karmić go przez jeden dzień. Gdy ludzie dowiedzą się, jak korzystać z dokumentacji systemowej, mogą znaleźć wiarygodne odpowiedzi bez spędzania czasu na StackExchange, patrząc na dokumenty innych firm.
Mark Stosberg,
11

Napraw to, modyfikując usługę jako

[Unit]
Description=Turn on LED after SSH is ready
After=network-online.target

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
WantedBy=network-online.target

Nadal nie do końca rozumiałem, co robię, ale teraz działa. Czy ktoś może wyjaśnić?

Aktualizacja

Ta odpowiedź została stworzona przeze mnie, zanim nadeszła akceptowana odpowiedź.

Silnik Ziemi
źródło
Że After=dyrektywa musi znajdować się w [Unit]sekcji. Po prostu to.
Bigon,