
Zum Kontext: Ich verwende Raspberry Pi Modell 3B+. Derzeit versuche ich, beim Hochfahren des Pi ein Python-Skript auszuführen. Aber ich habe Probleme, das Programm richtig zu starten. Wenn ich die folgende Servicedatei verwende, wird es zwar gestartet, aber alle 10 Sekunden neu gestartet, was dazu führt, dass das Programm unendlich oft gestartet wird. Ich möchte nur, dass das Programm einmal gestartet wird.
[Unit]
Description=Start Bling
[Service]
User=pi
Environment=DISPLAY=:0
WorkingDirectory=/home/pi/facial_recognition
Environment=XAUTHORITY=/home/pi/.Xauthority
Environment="prog_path"=/home/pi/facial_recognition
ExecStart=/usr/bin/python /home/pi/facial_recognition/run_on_start.py
Restart=always
RestartSec=10s
KillMode=process
TimeoutSec=infinity
[Install]
WantedBy=graphical.target
Aber wenn ich diesen Teil entferne:
Restart=always
RestartSec=10s
KillMode=process
TimeoutSec=infinity
oder ändern Sie es in „Restart=on-failure“. Beim Hochfahren des Raspberry Pi passiert nichts.
Das Programm muss nicht unbedingt mit automatischer Desktop-Anmeldung ausgeführt werden. Wenn es also eine mögliche Lösung in der Konsolenversion gibt, ist das auch in Ordnung. Ich habe es derzeit einfach so, damit ich leichter überprüfen kann, ob das Programm wie vorgesehen funktioniert.
Ich habe es auch mit crontab probiert, aber dann passierte beim Neustart nichts. Nicht mit und nicht ohne das '&' am Ende.
Antwort1
Ich denke, dass Folgendes passiert:
Ihr Computer fährt hoch, der Anzeigeserver startet und Ihr Dienst wird aktiviert. Er pi
ist jedoch noch nicht angemeldet und daher schlägt der Start beim ersten Mal fehl. Restart=always
Stellen Restart=10s
Sie sicher, dass alle 10 Sekunden ein Startversuch unternommen wird, und das funktioniert auch! Aber irgendwie wird Ihr Hauptprozess beendet und der Restart=
wird ständig ausgelöst.
Hier ist eine Idee zur Lösung des Problems:
Verschieben Sie den Dienst auf den Benutzerbus. Das bedeutet auch, dass Sie , , oder nicht definieren müssen DISPLAY
, da diese implizit sind. Ändern Sie dann den Abschnitt in . Fügen Sie hinzu , um den Dienst zu stoppen, wenn sich der Benutzer von der Sitzung abmeldet. ist ein Ziel, das nur auf dem Benutzerbus verfügbar ist und nur ausgelöst wird, wenn der Benutzer bei einer grafischen Sitzung angemeldet ist. / / / muss nur definiert werden, wenn Sie es wirklich für etwas brauchen (nicht nur, um Ihr Programm zu starten).XAUTHORITY
User=
[Install]
WantedBy=graphical-session.target
PartOf=graphical-session.target
graphical-session.target
Restart
RestartSec
KillMode
TimeoutSec
Dadurch wird sichergestellt, dass Ihr Dienst nicht gestartet wird, bevor der Benutzer bei der grafischen Sitzung angemeldet ist (was meiner Meinung nach vorher den Betrieb verhindert hat).
Verschieben Sie dazu Ihre Servicedatei von /etc/systemd/system/
nach /home/pi/.config/systemd/user/bling.service
und sorgen Sie dafür, dass sie folgendermaßen aussieht:
[Unit]
Description=Bling
PartOf=graphical-session.target
[Service]
WorkingDirectory=/home/pi/facial_recognition
Environment="prog_path"=/home/pi/facial_recognition
ExecStart=/usr/bin/python /home/pi/facial_recognition/run_on_start.py
[Install]
WantedBy=graphical-session.target
Aktivieren Sie es dann mitsystemctl --user enable bling.service