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ć?

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.


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ź.


Że After=dyrektywa musi znajdować się w [Unit]sekcji. Po prostu to.
Bigon,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.