Verwendung von systemd zum Starten von Programmen beim Start auf Raspberry Pi
Raspberry Pi ist ein leistungsstarker SBC (Single Board Computer), den Sie für verschiedene Anwendungen und Projekte verwenden können. Seine Vielseitigkeit liegt in der Fähigkeit, alle Arten von Programmen, einschließlich benutzerdefinierter Skripte, auszuführen, auch dank Raspberry Pi OS und anderen Linux-basierten Betriebssystemen, die es ausführt.
Das Ausführen eines Skripts oder Programms auf dem Raspberry Pi ist so einfach wie das Auffinden und Ausführen auf dem System. Aber was ist, wenn Sie diesen Prozess automatisieren möchten, vielleicht weil Ihr Projekt dies erfordert oder weil Sie Ihren Workflow optimieren möchten?
Eine Antwort darauf ist das Erlernen der Verwendung von systemd.
Was ist Systemd?
systemd ist eine Suite von Systemkomponenten für die Dienstkonfiguration und das Verhalten auf modernen Linux-Systemen. Es wird mit einer PID (Prozesskennung) von 1 identifiziert, da es der erste Prozess ist, der beim Systemstart gestartet wird. Insgesamt soll systemd Sie beim Verwalten und Ausführen von Programmen beim Systemstart unterstützen. Und genau das werden Sie nutzen, um Ihr Programm beim Start auf dem Pi zu starten.
Wie eingangs erwähnt, gibt es verschiedene Methoden zum Ausführen von Programmen beim Start auf Linux-Systemen, z. B. rc.local, cron und autostart. Systemd bietet jedoch eine bessere Lösung, wenn Sie GUI-Programme (grafische Benutzeroberfläche) starten, Anwendungen so automatisieren möchten, dass sie nach dem Start bestimmter Systemprozesse ausgeführt werden, oder Programme immer wieder ausführen möchten, bis Ihre Planung funktioniert.
Verwendung von systemd zum Starten von Programmen beim Start
systemd ist eine etwas kompliziertere Methode zum Starten von Programmen beim Start auf Linux-Systemen. Die Planungsflexibilität, die es gegenüber anderen Methoden bietet – den oben genannten -, überwiegt jedoch in jeder Hinsicht die Komplexität.
Die systemd-Methode verwendet Unit-Dateien, die wie INI-Dateien Codierungsinformationen zu Geräten, Diensten, Sockets, Startzielen und anderen wichtigen Systemkomponenten enthalten.
Es gibt verschiedene Arten von Gerätedateien. Basierend auf der Art der Ressource, die Sie deklarieren möchten, müssen Sie einen Einheitendateityp entsprechend auswählen. Für den Zweck dieses Handbuchs bleiben wir jedoch bei .service-Einheitendateien, mit denen Sie das Startverhalten von Programmen und Skripten auf dem System verwalten können.
Nachfolgend finden Sie eine Aufschlüsselung der Schritte zum Starten eines Skripts / Programms beim Start mit systemd.
Erstellen eines Dienstes
Um festzulegen, dass Ihr Programm beim Start ausgeführt wird, erstellen Sie eine Service Unit-Datei, die systemd mitteilt, welches Programm wann ausgeführt werden soll. Hier erfahren Sie, wie es geht.
- Geben Sie im CLI-Fenster sudo nano /lib/systemd/system/display.service ein . Sie können einen beliebigen Namen für Ihren Dienst verwenden, solange dieser mit der Erweiterung .service endet.
- Fügen Sie in die Servicedatei die folgenden Codezeilen ein:
[Unit]
Description=PiCounter
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
Alle Ihre allgemeinen Konfigurationsoptionen fallen in die Abschnitte " Einheit" und " Installieren" , während die dienstspezifischen Konfigurationsoptionen in den Abschnitt "Service" fallen.
Einige der oben genannten Direktiven-Wert-Paare, die Sie möglicherweise ändern müssen, umfassen:
ich. Nachher: Legt fest, wann der Dienst gestartet werden soll. Durch Festlegen von network.target wird sichergestellt, dass der aufgelistete Wert – in diesem Fall network.target – vor dem Starten der aktuellen Einheit gestartet wird. Es wird jedoch keine Abhängigkeitsbeziehung für den Dienst ausgelöst, die ausgelöst werden soll. Dies geschieht durch andere Anweisungen wie Wants, Requires und WantedBy.
Natürlich können Sie diesen Wert an Ihre Projektanforderungen anpassen. Wenn Sie beispielsweise möchten, dass Ihr Programm ausgeführt wird, nachdem Ihr Raspberry Pi eine Verbindung zu einem Netzwerk hergestellt hat, können Sie den Wert network-online.target verwenden. Weitere Informationen zu diesen Werten finden Sie in der Fedora-Dokumentation zu systemd .
ii. ExecStart: Enthält den absoluten Pfad und den Programm- / Skriptnamen, den Sie beim Start ausführen möchten. Je nachdem, was Sie ausführen möchten, müssen Sie für beide Anweisungen Werte hinzufügen.
iii. Benutzer: Identifiziert den Namen Ihres Raspberry Pi. Wenn Sie den Namen Ihres Pi geändert haben, müssen Sie diesen Wert für den Benutzer eingeben.
iv. WantedBy: Dies ist die häufigste Methode, um den Auslöser für eine Einheit anzugeben. Durch Festlegen von multi-user.target können Sie eine Abhängigkeitsbeziehung herstellen, in der das Programm ausgeführt wird, wenn die Systemsteuerung an die Mehrbenutzer-Shell übergeben wird.
Darüber hinaus wird Ihr Programm auch vor dem Start des X-Windows-Systems von Pi ausgeführt. Dies bedeutet, dass Ihr Programm bereits ausgeführt wird, bevor Sie sich beim System anmelden. Wenn Sie möchten, dass ein Skript ausgeführt wird, bevor Sie sich bei Ihrem Raspberry Pi anmelden, können Sie dies tun.
Die obigen Codezeilen funktionieren für Nicht-GUI-Programme. Wenn Sie jedoch ein GUI-Programm mit systemd ausführen möchten, sollten Sie Ihrer Servicedatei den folgenden Code hinzufügen:
[Unit]
Description=PiCounter
After=network.target
[Service]
Environment=Display=:0
Environment=XAUTHORITY/home/pi/.Xauthority
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always
[Install]
WantedBy=multi-user.target
Im obigen Direktiven-Wert-Paar müssen Sie lediglich den Wert für die ExecStart- Direktive ändern . Ersetzen Sie das Programm im Codeblock durch das Programm, das Sie beim Start ausführen möchten. Nachdem Sie die Servicedatei ausgefüllt haben, drücken Sie STRG + O , um sie zu speichern.
Testen Sie den Service
Überprüfen Sie bei bereitem Dienst manuell, ob er funktioniert. Geben Sie dazu im Terminal folgenden Befehl ein: sudo systemctl start display.service . Der Dienst sollte Ihre Anweisungen erfolgreich ausführen.
Beenden Sie es anschließend mit sudo systemctl stop display.service .
Aktivieren Sie den Dienst
Wenn Sie es geschafft haben, Ihr Programm erfolgreich mit dem Dienst auszuführen, müssen Sie es aktivieren, damit es Ihr Programm bei jedem Start Ihres Raspberry Pi automatisch ausführt.
Geben Sie dazu im Terminalfenster sudo systemctl enable display.service ein . Und wenn dies erledigt ist, geben Sie sudo reboot ein , um Ihren Pi neu zu starten.
Sobald Ihr Raspberry Pi hochfährt, sollte systemd Ihr Programm gemäß den angegebenen Anweisungen ausführen.
Automatisierung des Programmstarts beim Start auf Raspberry Pi
Wie bei den meisten Linux-Systemen können Sie mit Raspberry Pi OS auch auf verschiedene Arten Vorgänge ausführen. Dies gilt auch für die Planung von Programmstarts. Wenn Sie also GUI-Programme / Skripte beim Start starten und eine bessere Kontrolle über Ihre Planung wünschen, ist systemd eindeutig eine bessere Methode.
Wenn Sie jedoch eine einfachere Lösung wünschen oder Ihre Projektanforderungen eine bestimmte Planung erfordern, können Sie unseren Leitfaden zum Ausführen eines Raspberry Pi-Programms oder -Skripts beim Start lesen , um weitere Informationen zu erhalten.