Systemd: Wie kann ein systemd-Dienst gestartet werden, nachdem das Netzwerk vollständig verbunden ist?

12

Hintergrund

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

Das Skript ist hier nicht wichtig, nur um zu erwähnen, dass das Skript eine Endlosschleife ausführt, um die LED häufig ein- und auszuschalten, da ich die Frequenzsteuerung verwende. Dies ist also ein Beispiel für einen einfachen Service. Zumindest die akzeptierte Antwort auf diese Frage rät mir jedoch, den Typ auf Leerlauf zu setzen. Meine Servicedatei sieht also 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

Bewirken

Der Dienst wird wie erwartet ausgeführt. Ich habe jedoch festgestellt, dass beim Starten von Putty auf meinem Desktop-Computer direkt nach dem Einschalten der LED die Anmeldeaufforderung nicht sofort angezeigt wird. Also habe ich nachgefragt

$ systemd-analyze plot > output.svg

Das Ergebnis zeigt

Geben Sie hier die Bildbeschreibung ein

Frage

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

Erdmotor
quelle

Antworten:

11

Wenn es eine Frage zu einer systemd-Direktive gibt, können Sie anhand dieser man systemd.directivesfeststellen, wo sie dokumentiert ist. In diesem Fall zeigt es, dass After=in dokumentiert ist man systemd.unit.

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

Dieselbe Dokumentation dokumentiert auch die Optionen des Abschnitts [INSTALLIEREN] und After=ist dort nicht aufgeführt.

Kurz gesagt, Ihre After=Direktive befand sich am falschen Speicherort der Gerätedatei, sodass sie keine Auswirkungen hatte, bis Sie sie an den richtigen Speicherort verschoben haben.

Mark Stosberg
quelle
In diesem Fall ist "[Einheit]" "[Dienst]", da es sich um eine Dienstdatei handelt.
Faho
Eine kopierbare Antwort mit den Korrekturen wäre viel besser gewesen!
GerardJP
@GerardJP Lieber einem Mann das Fischen beibringen, als ihn einen Tag lang zu füttern. Sobald Benutzer wissen, wie die systemd-Dokumentation verwendet wird, können sie maßgebliche Antworten finden, ohne Zeit mit StackExchange zu verbringen und Dokumente von Drittanbietern zu lesen.
Mark Stosberg
11

Lassen Sie es beheben, indem Sie den Dienst als ä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 tat, aber es funktioniert jetzt. Kann jemand bitte erklären?

Aktualisieren

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

Erdmotor
quelle
Dass die After=Richtlinie in der [Unit]Sektion sein muss. Es ist nur so dass.
Bigon