Systemd: Wie startet man einen Systemd-Dienst, nachdem die Netzwerkverbindung vollständig hergestellt ist?

Systemd: Wie startet man einen Systemd-Dienst, nachdem die Netzwerkverbindung vollständig hergestellt ist?

Hintergrund

Ich schreibe ein einfaches Skript, das in Raspbain auf Raspberry Pi 2 ausgeführt werden soll. Es schaltet einfach eine LED ein, um anzuzeigen, dass ich bereit bin, von meinem Desktop-Computer aus eine Verbindung per SSH herzustellen.

Das Skript ist hier nicht wichtig, nur um zu erwähnen, dass das Skript, da ich die Frequenzsteuerung verwende, eine Endlosschleife durchläuft, um die LED häufig ein- und auszuschalten. Dies ist also ein Beispiel für einen einfachen Service.die akzeptierte Antwort auf diese Fragerate mir, den Typ auf Leerlauf zu setzen. Meine Servicedatei sieht dann so aus:

[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

Wirkung

Der Dienst läuft wie erwartet. Mir ist jedoch aufgefallen, dass beim Starten von Putty auf meinem Desktop-Computer direkt nach dem Aufleuchten der LED die Anmeldeaufforderung nicht sofort angezeigt wird. Also habe ich mit

$ systemd-analyze plot > output.svg

Das Ergebnis zeigt

Bildbeschreibung hier eingeben

Frage

Es sieht so aus, als ob meine Dienste nicht nach starten network-online.target. Was ist hier falsch und wie kann ich es beheben?

Antwort1

Wenn Sie Fragen zu einer systemd-Anweisung haben, können Sie mithilfe man systemd.directivesvon herausfinden, wo sie dokumentiert ist. In diesem Fall wird angezeigt, dass sie After=in dokumentiert ist man systemd.unit.

In dieser Datei wird angezeigt, dass die After=Anweisung in den „[UNIT] SECTION OPTIONS“ aufgeführt ist, was darauf hinweist, dass sie in diesen [Unit]Abschnitt der Datei gehört.

In derselben Dokumentation werden auch die Optionen im Abschnitt [INSTALL] beschrieben, After=sie sind dort jedoch nicht aufgeführt.

Kurz gesagt: Ihre After=Anweisung befand sich am falschen Speicherort in der Unit-Datei und hatte daher keine Wirkung, bis Sie sie an den richtigen Speicherort verschoben haben.

Antwort2

Beheben Sie das Problem, indem Sie den Dienst wie folgt ändern:

[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

Ich habe immer noch nicht ganz verstanden, was ich gemacht habe, aber jetzt funktioniert es. Kann das bitte jemand erklären?

Aktualisieren

Diese Antwort wurde von mir selbst erstellt, bevor die akzeptierte Antwort kommt.

verwandte Informationen