Service für restart anlegen (mit systemd)

  • Hi zusammen


    Ich bin mir ehrlich gesagt, nicht mal ganz sicher, ob ich hier mit meiner Frage im richtigen Forenbereich bin, aber ich versuche es einmal –> wenn nicht dann bitte verschieben.


    Zurzeit probiere ich, einen Service nach dem vollendeten Bootvorgang neu zu starten, wobei ich auf eine Lösung mit einem Eintrag in der rc.local gestossen bin. Gemäss meinen Infos ist das aber unter Raspbian Buster nicht mehr zeitgemäss und man sollte das eher mit systemd lösen (bitte verbessert mich, sollte das nicht korrekt sein). Bei meinen Recherchen habe ich dann u.a. folgendes entdeckt: *Klick* und frage mich nun, ob das für meine Zwecke das richtige ist und falls ja, wie dann mein *.service-File aussehen muss? Kommt das hier hin:


    Code
    [Unit]
    Description= Restart Pilight after boot
    
    [Service]
    Restart=*Pfad-Angabe wohin?*
    
    [Install]
    WantedBy=multi-user.target


    Dieses File (nennen wir es pilight-restart.service) muss dann unter /lib/systemd/system gespeichert und dort mit den richtigen chmod-Werten versehen werden (chmod u+x). Anschliessend kann der Service gestartet sudo systemctl start pilight-restart und aktiviert sudo systemctl enable pilight-restart werden, stimmt das so?


    Im Grunde genommen, soll dieser Dienst nach dem beendeten Bootvorgang dann folgende Terminal-Eingabe ersetzen: sudo service pilight restart


    Schon einmal im Voraus besten Dank für eure Hilfe.

  • Im Grunde genommen, soll dieser Dienst nach dem beendeten Bootvorgang dann folgende Terminal-Eingabe ersetzen: sudo service pilight restart

    Hast Du keine service-unit für pilight? ... weil Du "sudo service pilight restart" benutzt.


    Wenn Du keine hast, dann eine schreiben und zusätzlich eine timer-unit schreiben, die pilight mit seiner service-unit restartet.


    EDIT:


    Siehe auch: https://wiki.ubuntuusers.de/systemd/Timer_Units/


    https://wiki.ubuntuusers.de/systemd/Units/


    und die manpages "man systemd.timer" bzw. "man systemd.service".

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Edited once, last by rpi444 ().

  • Moin swissflyer,


    da ich meine pilight-Installation noch habe.

    Auf meinem RPi3 gibt es eine Serviceunit. Die sieht so aus:

    Du kannst es kontrollieren mit systemctl status pilight. Nach einem Neustart.


    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Vielleicht trifft man sich in der RPi-Plauderecke.

  • Danke für eure tollen Beiträge und hyle für das Verschieben des Threads...


    Das stimmt, es gibt bereits einen Service – den von Bernd erwähnten pilight.service. Ich habe wohl zu weit gedacht, da ich angenommen habe, dass ich einen weiteren Service brauche um pilight.service zu restarten.


    Mit dem Link von rpi444 sieht das ja aber ganz anders aus. Wenn ich das richtig verstehe, kann ich mein Vorhaben mit den Timer Units bestens umsetzen, da man hiermit auch die Möglichkeit hat, Ausführungszeiten relativ zum Systemstart zu setzen.


    Damit nun meine pilight.service nach jedem Bootvorgang einmal neu gestartet wird, sollte folgende Timer-Unit eigentlich korrekt sein:


    pilight-restart.timer

    Code
    [Unit]
    Description=Restart pilight.service 10sec after boot
    
    [Timer]
    OnBootSec=10s
    Unit=pilight.service
    
    [Install]
    WantedBy=multi-user.target


    Oder erkennt ihr hier noch einen Fehler?


    Die Datei pilight-restart.timer dann mit Root-Rechten in /etc/systemd/system speichern und anschliessenden den Timer mit sudo systemctl enable pilight-restart.timer aktivieren und mit sudo systemctl start pilight-restart.timer starten. Eine Kontrolle ob der Timer dann aktiv ist, kann mit systemctl list-timers erfolgen.



    EDIT: Jetzt kommt mir eben in den Sinn, dass ich mit obigen Timer den pilight.service ja nur starte; dass hingegen nützt mir nichts (der Dienst läuft zu diesem Zeitpunkt schon). Ich brauche explizit einen restart von pilight.service -> kann ich das dann immer noch mit der timer-Datei umsetzen?

  • Code
    [Timer]
    OnBootSec=10s
    Unit=pilight.service


    EDIT: Jetzt kommt mir eben in den Sinn, dass ich mit obigen Timer den pilight.service ja nur starte; dass hingegen nützt mir nichts (der Dienst läuft zu diesem Zeitpunkt schon). Ich brauche explizit einen restart von pilight.service -> kann ich das dann immer noch mit der timer-Datei umsetzen?

    Du hast 2 Möglichkeiten, je nach dem warum Du pilight restarten willst.

    1. pilight.service deaktivieren und nur von der timer-unit ca. >/=30 Sekunden nach dem Booten starten lassen, oder

    2. eine pilight_restart.service unit schreiben (... die nicht enabled werden muss), die von der timer-unit, ca. >/=45 Sekunden nach dem Booten ausgeführt wird.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Edited once, last by rpi444 ().

  • 2. eine pilight_restart.service unit schreiben, die von der timer-unit, ca. >/=45 Sekunden nach dem Booten ausgeführt wird.

    Ich versuche diese Variante einmal (so muss ich nichts an den bestehenden pilight-Einstellungen ändern); wäre das so hier richtig:


    pilight-restart.service

    Code
    [Unit]
    Description= Restart pilight / triggered by pilight-restart.timer 45 sec after boot
    
    [Service]
    ExecStart=pilight.service restart
    
    [Install]
    WantedBy=multi-user.target

    mit root-Rechten gespeichert in: /etc/systemd/system

    -> Anschliessend Service aktivieren und starten


    (bei dem Service-Abschnitt bin ich mir nicht sicher; kann ich so den Dienst restarten? Und benötige ich noch ein ExecStop?


    und die


    pilight-restart.timer

    Code
    [Unit]
    Description=Timer for restart pilight.service 45sec after boot
    
    [Timer]
    OnBootSec=45s
    Unit=pilight-restart.service
    
    [Install]
    WantedBy=multi-user.target

    mit root-Rechten gespeichert in: /etc/systemd/system

    -> Anschliessend Service aktivieren und starten


    Passt das so?

    Edited once, last by swissflyer: Pfadangaben (Speicherorte) der beiden Dateien abgeändert ().

  • Code
    [Service]
    ExecStart=pilight.services restart

    mit root-Rechten gespeichert in: /lib/systemd/system


    Passt das so?

    Das passt noch nicht. Versuch mal mit:

    Code
    [Service]
    Type=oneshot
    ExecStart=/bin/systemctl restart pilight.service

    BTW: Eigene units sollte man besser in "/etc/systemd/system/" erstellen.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

  • Danke dir – ich werde das so nun einmal testen und dann berichten.


    BTW: Eigene units sollte man besser in "/etc/systemd/system/" erstellen.

    Stimmt – habe das falsch kopiert (in /lib/... liegen die systemeigenen Units und in /etc/... die vom Benutzer erstellten Units).



    Noch eine Frage: Gibt es eine Möglichkeit, zu sehen, was der Pi gerade macht (via Terminal-Textausgabe)? Also so das ich beispielsweise sehen/kontrollieren kann, ob der Service nach 45sek neu gestartet wird?

  • Noch eine Frage: Gibt es eine Möglichkeit, zu sehen, was der Pi gerade macht (via Terminal-Textausgabe)? Also so das ich beispielsweise sehen/kontrollieren kann, ob der Service nach 45sek neu gestartet wird?

    Du kannst schauen mit z. B.:

    Code
    top
    ps aux
    dmesg

    , aber besser mit:

    Code
    systemctl status pilight-restart.timer pilight-restart

    ... oder (evtl. nur temporär aktiv) in die restart-service-Unit eine Zeile (mit z. B. touch) einfügen, die ins /temp-Verzeichnis eine leere Datei (beim ausführen) erzeugt.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

  • Genial (zumindest für mich :) – die Restart-Aktion funktioniert und erfüllt somit seinen Zweck.


    Mit ps aux sehe ich, dass der pilight-daemon neu geladen wurde.


    Problem solved – Danke an alle für die Hilfe!

  • Warum willst du eigentlich nach dem Neustart nochmals neu starten?

    Das ist natürlich eine berechtigte Frage :)


    Das Problem war folgendes (im Grunde genommen ist es immer noch eines, aber mit der hier beschriebenen Lösung habe ich nun wenigstens einen funktionsfähigen Workaround geschaffen):


    Ich weiss nicht warum, aber wenn Pilight normal gestartet wird, funktioniert das an- und ausschalten von 433Mhz-Steckdosen nicht. Ich erhalte dann einen – in diesen Kreisen – allseits bekannten Fehler: NOTICE: no pilight ssdp connections found.


    Es gibt im Netz viele Wege wie das gelöst werden konnte (pilight Standalone-Einstellungen anpassen / Netzwerkadressen neu zuweisen / Interfaces bearbeiten / etc). Ich habe dann aber irgendwann festgestellt, dass wenn ich den Pilight-Dienst nach dem Bootvorgang einfach nur stoppe und erneut starte, sich die Steckdosen einwandfrei schalten lassen. Nach kurzer Suche bin ich dann auf den restart-Befehl gestossen und da kam mir die Idee, diesen Befehl automatisch nach einem Bootvorgang ausführen zu lassen.


    Vielleicht lädt pilight nach meinem manuellen Restart einfach etwas zusätzliches, was es beim regulären Systemstart nicht macht (aber das ist nur meine Laien-Vermutung).

  • ssdp connections found


    Meine kurze Googlesuche sagt dass dies ein UDP Protokoll ist.


    Sofern ich richtige liege und das ganze übers Netzwerk läuft, so vermute ich, dass das Problem daran liegt dass pilight startet bevor das Netzwerk bereit ist.
    Dies kannst du auch damit lösen, dass man eine Abhängigkeit in der vorhandenen (orginalen) Service Unit definiert.


    Netzwerkfreigabe mounten mit systemd Mount Unit

    Das ganze habe ich hier auch.


    Dafür gibts in dem verlinkten Tutorial das Skript serverctl und serverctl.service


    Und in der pilight.service wird das ergänzt:

    Code
    Requires=serverctl.service
    After=serverctl.service
  • Das Problem war folgendes (im Grunde genommen ist es immer noch eines, aber mit der hier beschriebenen Lösung habe ich nun wenigstens einen funktionsfähigen Workaround geschaffen):

    Hat dein PI (mit dem pilight) Internetzugang bzw. benutzt Du diesen im (W)LAN, oder ist das der PI mit dem Du eine adhoc-WLAN-Verbindung hergestellt hast?

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

  • Ich versuche einmal eure Fragen in einem Post zu beantworten:


    Grundsätzlich habe ich zwei "Umgebungen" wo ich den Pi einsetzen möchte:


    1. Extern: in einem alten Gebäude, wo es über die Weihnachtszeit Musik und Licht steuern soll. An diesem Ort habe ich weder LAN noch WLAN zur Verfügung. Da der Pi dort offen zugänglich ist (es ist ein offenes Gebäude) habe ich möglichst wenig Hardware vor Ort. Dies ist auch der Grund warum der PI an der externen Stelle mit einem AdHoc-Netzwerk arbeitet -> so habe ich mit dem iPad und VNC trotzdem schnell einen Monitor zur Verfügung, wenn dieser benötigt wird.


    2. Intern: Zuhause am LAN (aktuell ist der Pi noch zuhause am LAN angeschlossen) -> auch die komplette pilight-Installation ist darüber erfolgt..


    Zurzeit funktionieren beide Netzwerke (AdHoc und LAN haben unterschiedliche subnetze). Es kann natürlich nun auch sein, dass der Fehler genau deswegen auftritt (würde mich aber verwundern, da daselbe Problem im Netz so häufig vorkommt).


    Wenn ich nun an den Pilight-Einstellungen weitere Anpassungen vornehmen sollte, wäre es wünschenswert, wenn diese an beiden Standorten (extern / intern) funktionieren würden. Andernfalls gebe ich mich mit der aktuellen Lösung gerne zufrieden.

  • Andernfalls gebe ich mich mit der aktuellen Lösung gerne zufrieden.

    Ohne LAN-/Internet-Verbindung wird der Ping zum Router bzw. zu 8.8.8.8 nicht funktionieren.

    Aber Du solltest die Abhängigkeiten für ein späteres starten der pilight.service-Unit auch ohne diese Pings realisieren können. Wenn nicht, dann solltest Du beim workaround bleiben.


    EDIT:


    Versuch mal auch mit:

    Code
    net.ipv4.ip_nonlocal_bind = 1

    in der "/etc/sysctl.conf"-Datei (oder gleichwertig).

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Edited once, last by rpi444 ().

  • Dann bleibe ich – zumindest vorläufig – lieber bei der aktuellen Variante. Zurzeit laufen alle wichtigen Dinge (Musikplayer / AdHoc-Netzwerk / Pilight für die Steckdosen-Schaltung) und ich möchte da nun mangels Wissen sehr ungern noch etwas kaputtmachen.


    Vielleicht optimiere ich den Ablauf, resp. die Installationen anfangs Jahr, wenn der Pi wieder in meinem LAN hängt, und melde mich dann bei allfälligen Problemem gerne wieder hier im Forum. An dieser Stelle euch beiden nochmals besten Dank für die tolle Hilfe – ohne dieses Forum hätte ich mein Projekt wohl in den nächsten paar Jahren nicht hingekriegt.