Automatisches Starten eines Python-Skripts auf dem Raspberry Pi mit Systemd

Veröffenticht am 27.05.2024    von     in der Kategorie Raspberry Pi, Raspberry Pi OS     bisher 10 Reaktionen


In diesem Artikel zeige ich, wie man ein Python-Skript automatisch beim Systemstart auf dem Raspberry Pi ausführen kann. Diese Methode funktioniert auf Systemen mit und ohne Desktop-Umgebung und ist mit den aktuellen Versionen des Raspberry Pi OS, einschließlich Bullseye und Bookworm, kompatibel.

 

 

Warum Systemd?

Systemd ist ein init-System zur Verwaltung von Systemprozessen auf modernen Linux-Distributionen. Es bietet eine flexible und robuste Möglichkeit, Dienste beim Systemstart zu verwalten. Wer sein Python-Skript mit Systemd startet, kann sicher sein, dass es zuverlässig und konsistent ausgeführt wird.

 

Schritte zur Einrichtung des Autostarts

1. Python-Skript vorbereiten

Stelle sicher, dass dein Python-Skript den absoluten Pfad zu allen wichtigen Dateien verwendet. Hier ist ein Beispiel für eine SQLite3-Datenbankdatei im Unterordner data und eine Fonts-Datei im Unterordner fonds:

 

2. Systemd-Dienstdatei erstellen

Erstelle eine neue Dienstdatei unter /etc/systemd/system/beispiel.service:

beispiel ist hier ein Synonym für den verwendeten Namen deines Skripts.

Füge den folgenden Inhalt ein und passe die Pfade und den Benutzer an:

 

3. Systemd-Dienst aktivieren und starten

Lade die Systemd-Daemon neu und aktiviere den Dienst:

Beachte: beispiel.service anzupassen.

4. Überprüfen des Dienststatus

Stelle sicher, dass der Dienst korrekt gestartet wurde:

Beachte: beispiel.service anzupassen.

5. Dienst deaktivieren und entfernen (optional)

Wenn du den Autostart wieder entfernen möchtest, deaktiviere den Dienst und lösche ggf. die Dienstdatei:

Beachte: beispiel.service anzupassen.

Fazit

Durch die Verwendung von Systemd kannst du sicherstellen, dass dein Python-Skript beim Systemstart zuverlässig und konsistent ausgeführt wird. Diese Methode ist besonders nützlich für Projekte, die auf verschiedenen Raspberry Pi Modellen im Desktop-Modus und ohne Desktop-Modus laufen.

 

Hinweis: Auf meinem Blog findest du frühere Beiträge zum Autostart von Python-Skripten auf dem Raspberry Pi:

Die Verwendung von Systemd bietet eine zusätzliche Möglichkeit, die auf allen Raspberry Pi OS-Versionen funktioniert und sowohl für Desktop- als auch für Headless-Setups geeignet ist.


Transparenz-Hinweis:

Die auf dieser Seite verwendeten Produktlinks sind sogenannte Affiliate-Links zu einem Partnerprogramm. Für dich entstehen dadurch keine Mehrkosten, ich erhalte durch deinen Kauf über den Link eine kleine Provision.


Wolfgang Raab – Betreiber von webnist.de

Mein Name ist Wolfgang, ich beschäftige mich nun schon seit 1985 mit der EDV und im Besonderen mit der Software- und Webentwicklung.

Auf diesem Blog schreibe ich über Dinge, die mich begeistern, beschäftigen und ich der Meinung bin, es könnte für andere interessant und hilfreich sein.

Als großer Fan des Raspberry Pi finde ich es spannend, wie man den kleinen Computer in Verbindung mit dem IoT und Smart Home nutzen kann. Deshalb behandeln viele Beiträge auch genau dieses Thema.

Ich bin ein leidenschaftlicher Leser und Fotograf. Wenn ich nicht gerade in einem spannenden Roman versinke, bin ich oft unterwegs, um die Schönheit der Welt mit meiner Kamera einzufangen und zu teilen.

Weitere Infos und Fotos findest du auf einem der folgenden Plattformen.






Mehr erfahren?

Besuche die "About"-Seite meines Blogs und finde heraus, wie du mit mir in den Bereichen Web- und Mobile-Programmierung und Raspberry Pi zusammenarbeiten kannst. Hier beginnt deine digitale Reise.


Unterstützen

Dieser Beitrag hat dir gefallen und konnte dir bei deinem Projekt oder Problem behilflich sein? Dann würde ich mich sehr freuen, wenn du dich mit einer noch so kleinen Spende erkenntlich zeigen möchtest.




  • Hans schrieb am 30. Mai 2024:

    Mittlerweile läuft wieder (fast) alles. Eine Frage noch: Kann ich den Dienst auch so einrichten, dass er erst gestartet wird, wenn Mosquitto läuft? Was muss ich dafür machen?

    • Raab Wolfgang schrieb am 31. Mai 2024:

      Ja, ein Dienst kann mit systemd in Abhängigkeit von einem anderen Dienst gestartet werden. Dies wird durch die Konfiguration der [Unit]-Sektion der Systemd-Dienstdatei erreicht. Hier gibt es verschiedene Anweisungen:
      Zum Beispiel: After=: Gibt an, dass der Dienst nach einem anderen Dienst gestartet werden soll.
      Siehe: https://manpages.debian.org/unstable/manpages-de/systemd.service.5.de.html

  • Hans schrieb am 30. Mai 2024:

    Die mosquitto.service sieht so aus:
    [Unit]
    Description=Mosquitto MQTT Broker
    Documentation=man:mosquitto.conf(5) man:mosquitto(8)
    After=network.target
    Wants=network.target

    [Service]
    Type=notify
    NotifyAccess=main
    ExecStart=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
    ExecReload=/bin/kill -HUP $MAINPID
    Restart=on-failure
    ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto
    ExecStartPre=/bin/chown mosquitto /var/log/mosquitto
    ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto
    ExecStartPre=/bin/chown mosquitto /run/mosquitto

    [Install]
    WantedBy=multi-user.target

    • Raab Wolfgang schrieb am 30. Mai 2024:

      Persönlich kenne ich mich mit Mosquitto nicht aus. Man findet aber oft einen Hinweis in der Logdatei.
      Um systemd zu testen, würde ich einfach ein kleines Python-Skript schreiben, das einfach einen Zähler inkrementiert. Wenn der Dienst korrekt gestartet wurde, kann man ihn sofort abbrechen und löschen.

  • Hans schrieb am 30. Mai 2024:

    Die json-data.service habe ich mittlerweile gelöscht, weil auch mosquitto nicht mehr startete. Auch ein reinstall von Mosquitto hat nicht geholfen weshalb ich ein Problem mit systemd vermute. Die Fehlermeldung sieht so aus:
    pi@raspberrypi:~ $ sudo systemctl status mosquitto
    ● mosquitto.service – Mosquitto MQTT Broker
    Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
    Active: failed (Result: signal) since Thu 2024-05-30 17:00:19 CEST; 13s ago
    Docs: man:mosquitto.conf(5)
    man:mosquitto(8)
    Process: 1298 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS)
    Process: 1299 ExecStartPre=/bin/chown mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS)
    Process: 1301 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS)
    Process: 1303 ExecStartPre=/bin/chown mosquitto /run/mosquitto (code=exited, status=0/SUCCESS)
    Process: 1304 ExecStart=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf (code=killed, signal=ILL)
    Main PID: 1304 (code=killed, signal=ILL)

    Mai 30 17:00:19 raspberrypi systemd[1]: mosquitto.service: Failed with result ‘signal’.
    Mai 30 17:00:19 raspberrypi systemd[1]: Failed to start Mosquitto MQTT Broker.
    Mai 30 17:00:19 raspberrypi systemd[1]: mosquitto.service: Service RestartSec=100ms expired, scheduling restart.
    Mai 30 17:00:19 raspberrypi systemd[1]: mosquitto.service: Scheduled restart job, restart counter is at 5.
    Mai 30 17:00:19 raspberrypi systemd[1]: Stopped Mosquitto MQTT Broker.
    Mai 30 17:00:19 raspberrypi systemd[1]: mosquitto.service: Start request repeated too quickly.
    Mai 30 17:00:19 raspberrypi systemd[1]: mosquitto.service: Failed with result ‘signal’.
    Mai 30 17:00:19 raspberrypi systemd[1]: Failed to start Mosquitto MQTT Broker.

    • Raab Wolfgang schrieb am 30. Mai 2024:

      Ok, da ist eine Fehlersuche nicht mehr möglich.

  • Hans schrieb am 30. Mai 2024:

    Das ist seltsam, den Benutzer pi gibt es nämlich und nur den habe ich eingesetzt.

    • Raab Wolfgang schrieb am 30. Mai 2024:

      Ok, hört sich tatsächlich seltsam an. Wie sieht den die json-data.service Datei aus?

  • Hans schrieb am 30. Mai 2024:

    Ich bekomme unter buster die folgende Fehlermeldung, wenn ich das Kommando sudo systemctl start json-data.service absetze:
    Failed to start json-data.service: Unit json-data.service has a bad unit file setting.
    See system logs and ‘systemctl status json-data.service’ for details.
    systemctl status json-data.service zeigt dann:
    Mai 30 10:21:19 raspberrypi systemd[1]: /etc/systemd/system/json-data.service:1: Assignment outside of section. Ignoring.
    Mai 30 10:21:19 raspberrypi systemd[1]: /etc/systemd/system/json-data.service:2: Assignment outside of section. Ignoring.
    Mai 30 10:21:19 raspberrypi systemd[1]: /etc/systemd/system/json-data.service:9: Invalid user/group name or numeric ID: pi # Passe den Benutzer an, unter dem das Skript ausgeführt wer
    Mai 30 10:23:30 raspberrypi systemd[1]: /etc/systemd/system/json-data.service:1: Assignment outside of section. Ignoring.
    Mai 30 10:23:30 raspberrypi systemd[1]: /etc/systemd/system/json-data.service:2: Assignment outside of section. Ignoring.
    Mai 30 10:23:30 raspberrypi systemd[1]: /etc/systemd/system/json-data.service:9: Invalid user/group name or numeric ID: pi # Passe den Benutzer an, unter dem das Skript ausgeführt wer
    Mai 30 10:23:50 raspberrypi systemd[1]: /etc/systemd/system/json-data.service:1: Assignment outside of section. Ignoring.
    Mai 30 10:23:50 raspberrypi systemd[1]: /etc/systemd/system/json-data.service:2: Assignment outside of section. Ignoring.
    Mai 30 10:23:50 raspberrypi systemd[1]: /etc/systemd/system/json-data.service:9: Invalid user/group name or numeric ID: pi # Passe den Benutzer an, unter dem das Skript ausgeführt wer

    • Raab Wolfgang schrieb am 30. Mai 2024:

      Hallo,
      die Fehlermeldung deutet darauf hin, dass die Dienstdatei json-data.service syntaktische Fehler enthält. Insbesondere gibt es Zuweisungen außerhalb der Abschnitte und einen ungültigen Benutzernamen oder Kommentar in der Datei.
      Daher empfehle ich einmal dein Skript mit der eventuellen Pfadangabe aus dem Terminal aufzurufen und die Daten des Benutzers (User=) anpassen.
      Viele Grüße
      Wolfgang


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Notwendige Felder sind mit * markiert.

 

Kleiner Hinweis, alle Kommentare werden moderiert.

Dies bedeutet, der Kommentar wird vor der Veröffentlichung durchgelesen und von mir geprüft. Auch behalte ich mir vor, jeden Kommentar zu löschen, der nicht direkt auf das Thema abzielt oder nur den Zweck hat, Leser oder Autoren herabzuwürdigen.

Entdecke die Welt von Webnist.de

Erfahre mehr über die Hintergründe meines Blogs und wie ich dich bei deinen digitalen Projekten unterstützen kann.

Aktuelles Video auf YouTube

Beschreibung der Verwendung eines TTP223B Touch Sensors am GPIO Port des Raspberry Pi mit Python.