Python-Skript wird beim Neustart/Start von Raspberry Pi nicht richtig gestartet

Python-Skript wird beim Neustart/Start von Raspberry Pi nicht richtig gestartet

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 piist jedoch noch nicht angemeldet und daher schlägt der Start beim ersten Mal fehl. Restart=alwaysStellen Restart=10sSie 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).XAUTHORITYUser=[Install]WantedBy=graphical-session.targetPartOf=graphical-session.targetgraphical-session.targetRestartRestartSecKillModeTimeoutSec

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.serviceund 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

verwandte Informationen