After=network.target
Versuch mal stattdessen After=network-online.target.
//Edit
Denn:
Sep 08 19:46:18 raspberrypi k40_rl_automatik.py[392]: OSError: [Errno 101] Network is unreachable
After=network.target
Versuch mal stattdessen After=network-online.target.
//Edit
Denn:
Sep 08 19:46:18 raspberrypi k40_rl_automatik.py[392]: OSError: [Errno 101] Network is unreachable
Systemd-Dienst bricht beim booten ab, manuell lässt er sich aber starten? Schau mal ob du hier fündig wirst!
wo muss das rein?
Anstelle von After=network.target in die Systemd Service Unit.
//Edit
Sinnvoll wäre evtl. in die Zeile darunter noch Wants=network-online.target hinzuzufügen.
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
Zeig doch einfach mal dieses ominöse k40_rl_automatik.py Skript in einem Codeblock, damit man sich mal ein Bild machen kann!
Alles anzeigenSep 08 21:48:40 raspberrypi systemd[1]: k40_rl.service: Start request repeated too quickly.
[Service]
ExecStart=/usr/bin/python3 -u k40_rl_automatik.py
WorkingDirectory=/home/pi/prod3/k40
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
In die [Service]-Section kannst Du z. B. auch die Zeile:
eintragen.
EDIT:
Poste auch die Ausgaben von:
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-kompendium.de/sites/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:
[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:
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?
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.
ZitatAlles anzeigen[andre@andre-Fujitsu-i5 ~]$ ./make_test.sh
Versuche test.service zu stoppen
Dienst erfolgreich beendet
● test.service - TestService
Loaded: loaded (/home/andre/.config/systemd/user/test.service; static)
Active: active (exited) since Thu 2021-09-09 10:42:25 CEST; 5s ago
Process: 14618 ExecStart=/home/andre/test.py (code=exited, status=0/SUCCESS)
Main PID: 14618 (code=exited, status=0/SUCCESS)
CPU: 113ms
Sep 09 10:42:25 andre-Fujitsu-i5 systemd[543]: Starting TestService...
Sep 09 10:42:25 andre-Fujitsu-i5 test.py[14618]: Hello from 3.9.7 (default, Sep 3 2021, 14:16:20)
Sep 09 10:42:25 andre-Fujitsu-i5 test.py[14618]: [GCC 11.1.0]
Sep 09 10:42:25 andre-Fujitsu-i5 test.py[14618]: I'm in /home/andre
Sep 09 10:42:25 andre-Fujitsu-i5 test.py[14618]: Python Executeable: /home/andre/.pyenv/versions/3.9.7/bin/python3
Sep 09 10:42:25 andre-Fujitsu-i5 systemd[543]: Finished TestService.
Das Script, welches das Verzeichnis erstellt, die Service-Unit und das Programm erstellt und ausführbar macht:
#!/bin/bash
mkdir -p ~/.config/systemd/user/
# Service beenden, falls das Script einmal aufgerufen worden ist
echo "Versuche test.service zu stoppen"
systemctl --user stop test 2> /dev/null && echo "Dienst erfolgreich beendet" || echo "Dienst test.service existiert noch nicht"
# https://tldp.org/LDP/abs/html/here-docs.html
cat > ~/.config/systemd/user/test.service <<EOF
[Unit]
Description=TestService
[Service]
# Für ein Programm, dass gestartet wird und sich selbst beendet
Type=oneshot
# Wird weiterhin als aktiv angezeigt, nachdem
# das Programm beendet worden ist
RemainAfterExit=True
# %h ist der Platzhalter für Home-Directory
# Da es eine User-Systemd-Unit ist, gilt der User
# für den die Service-Datei erstellt worden ist
ExecStart=%h/test.py
EOF
# Programm
cat > ~/test.py <<EOF
#!/usr/bin/env python3
import sys
from pathlib import Path
print("Hello from", sys.version)
print("I'm in", Path().resolve())
print("Python Executeable:", sys.executable)
EOF
# Ausführbar machen
chmod +x ~/test.py
# Die User-Service-Units neu einlesen
systemctl --user daemon-reload
# Test starten
systemctl --user start test
# 5 Sekunden warten und Ausgabe anzeigen
sleep 5
systemctl --user status test
Alles anzeigen
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.
vielen Dank, ich arbeite dann mal alle Infos von euch durch und melde mich wieder.
Nicht so leicht alles, aber man lernt wenigstens viel dazu, beim Fehler suchen
war geschäftlich unterwegs, hoffe morgen mal weiter testen zu können.
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!