Systemd-Dienst bricht beim booten ab, manuell lässt er sich aber starten

  • Jetzt wird es immer blöder (war schon vor deinen Empfehlungen mit den Unit-Änderungen so) dass auch der manuelle Start nicht mehr klappt:


    \u25cf k40_rl.service - k40_rl

    Loaded: loaded (/etc/systemd/system/k40_rl.service; enabled; vendor preset: enabled)

    Active: failed (Result: exit-code) since Wed 2021-09-08 21:48:40 CEST; 10s ago

    Process: 1017 ExecStart=/usr/bin/python3 -u k40_rl_automatik.py (code=exited, status=200/CHDIR)

    Main PID: 1017 (code=exited, status=200/CHDIR)


    Sep 08 21:48:40 raspberrypi systemd[1]: k40_rl.service: Service RestartSec=100ms expired, scheduling restart.

    Sep 08 21:48:40 raspberrypi systemd[1]: k40_rl.service: Scheduled restart job, restart counter is at 5.

    Sep 08 21:48:40 raspberrypi systemd[1]: Stopped k40_rl.

    Sep 08 21:48:40 raspberrypi systemd[1]: k40_rl.service: Start request repeated too quickly.

    Sep 08 21:48:40 raspberrypi systemd[1]: k40_rl.service: Failed with result 'exit-code'.

    Sep 08 21:48:40 raspberrypi systemd[1]: Failed to start k40_rl.


    mit:


    [Unit]

    Description=k40_rl

    After=network-online.target

    Wants=network-online.target


    [Service]

    ExecStart=/usr/bin/python3 -u k40_rl_automatik.py

    WorkingDirectory=/home/pi/prod3/k40

    StandardOutput=inherit

    StandardError=inherit

    Restart=always

    User=pi


    [Install]

    WantedBy=multi-user.target


    Hab jetzt auch mal in meiner Not ein Raspi-Update gemacht.


    Pythonprogramm k40_rl_automatik.py funktioniert wenigstens noch wenn man es direkt im Thonny ablaufen lässt. Wollte aber schon, dass es automatisch hochfährt wenn mal Stromausfall wäre und der Raspi neu hoch fährt. Vielleicht kommt ja noch ein Tipp von Euch.


    Danke

  • In die [Service]-Section kannst Du z. B. auch die Zeile:

    Code
    RestartSec=20s

    eintragen.


    EDIT:


    Poste auch die Ausgaben von:

    Code
    ls -la /home/pi | grep -i prod3
    ls -la /home/pi/prod3 | grep -i k40
    ls -la /home/pi/prod3/k40/k40_rl_automatik.py

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

    Edited once, last by rpi444 ().

  • Jetzt zum Testvorschlag von Dennis 89


    ... eine /home/pi/test.txt hat er NICHT erstellt.

    Was sagt den sudo find / -name test.txt -ls? Zur Erklärung, die Datei wurde angelegt aber nicht da wo du es erwartest. Das hat zwei Gründe 1) es wurde kein absoluter Pfad angegeben. Daher wird die Datei im Homeverzeichnis des Benutzers angelegt der diese Service Unit ausgeführt hat. 2) da in der Service Unit kein Benutzer an gegeben ist wird diese von root ausgeführt. Deshalb wirst du die Datei "test.txt" mit großer Wahrscheinlicjkeit im root Verzeichnis finden.



    Hab jetzt auch mal in meiner Not ein Raspi-Update gemacht

    Wie hast du das Update gemacht? Wenn du ein rpi-update update gemacht hast würde ich das zurück machen. https://www.elektronik-kompend…/raspberry-pi/2006061.htm


    Jetzt zum Problem mit dem MQTT Broker. Du kannst wie rpi444 vorgeschlagen hat einen "timer" einbauen. Du kannst dir auch mal die Anleitung von Hofei zur Netzwerkfreigabe mounten mit systemd Mount Unit ansehen. Da erklärt er wie man mit mit einem Hilfsskript auf das Netzwerk bzw. den Server (oder in deinem Fall dem Broker) warten kann.

  • .... 2) da in der Service Unit kein Benutzer an gegeben ist wird diese von root ausgeführt. ...

    Der TE hat in der service-unit, pi als Benutzer angegeben:

    Code
    [Service]
    ExecStart=/usr/bin/python3 -u k40_rl_automatik.py
    WorkingDirectory=/home/pi/prod3/k40
    StandardOutput=inherit
    StandardError=inherit
    Restart=always
    User=pi

    Solche Statusmeldungen:

    Code
    code=exited, status=200/CHDIR

    gibt es i. d. R. wenn der angegebene Benutzer nicht die Rechte oder evtl. auch nur teilweise Rechte, im "WorkingDirectory" hat.

    Ist im Verzeichnis "/home/pi" oder in Unterverzeichnissen, etwas als user root, angelegt oder editiert worden?

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

  • rpi444 ich hatte mich auf den Test in Beitrag 10 bzw 13 bezogen. In dieser Service Unit war kein Benutzer angegeben. Daher mein Hinweis das die Datei nicht unter home/pi/test.txt zu finden ist.


    Code
    [Unit]
    Description=Do something
    
    [Service]
    ExecStart=/home/pi/programmtest.py
    
    [Install]
    WantedBy=multi-user.target
  • Systemd ist nicht einfach zu verstehen für Anfänger, da es dort viele Fallstricke gibt.


    Wenn man z.B. wie Steinardo das Script ohne Interpreter startet, muss es ausführbar sein und der Shebang muss auch vorhanden sein.

    Der Shebang gibt dann letztendlich vor, welcher Interpreter verwendet wird. Das kann auch was ganz anderes sein (PHP, Bash, CSH, ZSH, Perl, usw.).


    Die Angabe zum Pfad des Programms sollte immer absolut sein und für das Homeverzeichnis kann man den Platzhalter %h verwenden.



    Das Script, welches das Verzeichnis erstellt, die Service-Unit und das Programm erstellt und ausführbar macht:


    Ein Daemon, d.h. ein Programm, welches nie endet, muss mit einem anderen Typ gestartet werden: Type=simple.

    Der Type oneshot ist für Programme/Scripts, die kurz nach ihrer Ausführung automatisch enden.