.service startet mein Program nicht !?

  • Hallo,

    ich würde gerne ein Programm, über einen .service, nach dem hochfahren des Raspberry starten.

    Das PythonProgramm liegt unter /home/pi/Frontend/main.py.

    Der dazu geschriebene Service liegt unter /etc/systemd/system/Frontend.service und hat folgenden Inhalt:

    Starte ich das Programm direkt über sudo python3 /home/pi/Frontend/main.py läuft es ohne Probleme.

    Starte ich Frontend.service über sudo systemctl start Frontend.service erhalte ich folgenden Status:

    Code
    pi@raspberry:~$ sudo systemctl status Frontend.service
    ● Frontend.service - Frontend Service
       Loaded: loaded (/etc/systemd/system/Frontend.service; enabled; vendor preset: enabled)
       Active: inactive (dead) since Tue 2021-04-27 16:08:05 CEST; 9s ago
      Process: 4512 ExecStart=/usr/bin/python3 /home/pi/Frontend/main.py (code=killed, signal=HUP)
     Main PID: 4512 (code=killed, signal=HUP)
    
    Apr 27 16:08:02 raspberry systemd[1]: Started Frontend Service.
    Apr 27 16:08:05 raspberry systemd[1]: Frontend.service: Main process exited, code=killed, status=1/HUP
    Apr 27 16:08:05 raspberry systemd[1]: Frontend.service: Succeeded.

    Das gleiche Problem tritt auf, wenn ich alles direkt im /home/pi Verzeichnis versuche.

    Habe das Programm selber nicht gepostet, da es recht umfangreich ist. Kann es aber gerne nach holen sollte es von nutzen sein.

    Mich irritiert, dass es normal läuft wenn ich es direkt starte nicht aber wenn ich es über den Service starten möchte !?

  • Starte ich das Programm direkt über sudo python3 /home/pi/Frontend/main.py läuft es ohne Probleme.

    Starte ich Frontend.service über sudo systemctl start Frontend.service erhalte ich folgenden Status:

    Das Script läuft bereits (und belegt die angeforderten Resoucen) ?

    Dann versuche es mit systemctl try-reload-or-restart ..., oder einer anderen Startoption beim Testen.

    Wenn das Service dann wunschgemäss funktioniert, kannst Du es mit enable in den Bootprozess einbinden.

    Siehe < man systemctl >



    Servus !

    RTFM = Read The Factory Manual, oder so

  • Wenn das Programm von Dir über die Kommandozeile gestartet wird, dann läuft es mit den Rechten des Users, mit dem Du eingeloggt bist. Im Gegensatz dazu läuft das Programm beim Start über den systemd-Dienst unter dem User root.

    Man sollte annehmen, dass dies eigentlich kein Problem darstellt. Aber wenn zum Beispiel eine Datei Deinem Standard-User (= der User, mit dem Du eingeloggt bist) gehört und die Datei allen anderen Usern den Zugriff verweigert, dann kommt der systemd-Dienst in Schwierigkeiten, wenn Dein Programm die Datei in Beschlag nimmt.

    Vielleicht hilft dieses Detail bei der Suche nach der Ursache.

    Mein Github-Repository ist hier zu finden.

  • Hofei: Nach meinem Kenntnisstand ist es nicht das gleiche, ob man als User root ein Programm laufen lässt oder mit sudo ein Programm startet. sudo schaltet nicht auf den User root um und nach der Programmausführung wieder zurück.

    Mein Github-Repository ist hier zu finden.

  • Wenn das Programm von Dir über die Kommandozeile gestartet wird, dann läuft es mit den Rechten des Users, mit dem Du eingeloggt bist. Im Gegensatz dazu läuft das Programm beim Start über den systemd-Dienst unter dem User root.

    Kann man ändern.

    Aber wenn zum Beispiel eine Datei Deinem Standard-User (= der User, mit dem Du eingeloggt bist) gehört und die Datei allen anderen Usern den Zugriff verweigert, dann kommt der systemd-Dienst in Schwierigkeiten, wenn Dein Programm die Datei in Beschlag nimmt.

    root darf alles, egal was ein User an Attributen vergeben hat.


    Wenn Dateien erstellt werden und der Dienst mit root-rechten ausgeführt wird, gehören die erstellten Dateien dem User root und der normale User kann dann nicht mehr darauf zugreifen. Also das Problem ist umgekehrt. Root darf alles, normaler User hat nicht mehr vollen Zugriff.

  • Werden in deinem Programm durchwegs absolute Pfade verwendet?

    Wobei das eigentlich WorkingDirectory=/home/pi/Frontend richten dürfte.


    Wie ist die Ausgabe von journalctl -u Frontend.service

    In dem Programm arbeite ich mit filepath = os.path.dirname(__file__), sollte also passen.


    journalctl -u Frontend.service gibt mir folgende Ausgabe:

    Code
    pi@raspberry:~$ journalctl -u Frontend.service
    -- Logs begin at Tue 2021-04-27 16:19:17 CEST, end at Wed 2021-04-28 08:35:32 CEST. --
    Apr 27 16:19:32 raspberry systemd[1]: Started Frontend Service.
    Apr 27 16:19:36 raspberry systemd[1]: Frontend.service: Main process exited, code=killed, status=1/HUP
    Apr 27 16:19:36 raspberry systemd[1]: Frontend.service: Succeeded.
    Apr 28 08:35:21 raspberry systemd[1]: Started Frontend Service.
    Apr 28 08:35:24 raspberry systemd[1]: Frontend.service: Main process exited, code=killed, status=1/HUP
    Apr 28 08:35:24 raspberry systemd[1]: Frontend.service: Succeeded.


    Was sagt sudo journalctl -e --unit Frontend?


    Es gibt viele Möglichkeiten, wieso dein Programm nicht läuft.


    Sicher, dass alle Abhängigkeiten Systemweit verfügbar sind?

    sudo journalctl -e --unit Frontend gibt mir folgende Ausgabe:

    Und ich bin mir nicht zu 100% sicher, dass alle Abhängigkeiten Systemweit verfügbar sind.


    pi@raspberry:~$ sudo systemctl try-reload-or-restart Frontend.service funktioniert auch nicht.


    Klingt für mich erstmal wie ein Programm mit grafischer Benutzeroberfläche (GUI). Wo soll denn dieses Programm gestartet werden und was macht das?

    Es handelt sich um ein mit Pygame geschriebenes GUI zur Visualisierung von Daten die über MQTT rein kommen.

    Kann die Grafische Ausgabe das Problem sein ?

    Was meinst du mit "Wo soll denn dieses Programm gestartet werden.." ?

  • Über eine .desktop Datei im Autostart-Verzeichnis eines Users kann ein Grafikprogramm gestartet werden.


    Servus !


    Bei pi os light muss die Grafik (X-Org) nachinstalliert werden.

    RTFM = Read The Factory Manual, oder so

  • Über eine .desktop Datei im Autostart-Verzeichnis eines Users kann ein Grafikprogramm gestartet werden.


    Servus !


    Bei pi os light muss die Grafik (X-Org) nachinstalliert werden.

    Verstehe nicht ganz die Konsequenz, sind jetzt die Berechtigungen das Problem ?

    Wieso kann ich das Programm manuell starten, aber nicht über den Service ?

    • Official Post

    Du schreibst, dass das Programm manuell gestartet läuft, also fehlt imho dem Autostart vermutlich nur die Angabe, wo das Programm angezeigt werden soll.


    Du könntest es mal so

    Code
    ExecStart=DISPLAY=:0 /usr/bin/python3 /home/pi/Frontend/main.py

    oder so ähnlich versuchen.

  • Ich kenne Pygame nicht. auch nicht wohin es welche Grafikausgabe vornimmt.

    Auch wenn Pygame ohne X-Server seine Ausgabe direkt in den Framebuffer schreibt (was möglich ist) braucht es zu Interaktion ein Terminal eines Users.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Du schreibst, dass das Programm manuell gestartet läuft, also fehlt imho dem Autostart vermutlich nur die Angabe, wo das Programm angezeigt werden soll.


    Du könntest es mal so

    Code
    ExecStart=DISPLAY=:0 /usr/bin/python3 /home/pi/Frontend/main.py

    oder so ähnlich versuchen.


    So bekomme ich eine Fehlermeldung:

    Apr 28 09:36:13 raspberry systemd[1]: /etc/systemd/system/Frontend.service:6: Executable "DISPLAY=:0" not found in path

  • Probier mal folgendes und schau mal nach, ob die Datei /home/pi/.Xauthority auch existiert.


    After und WantedBy sind verändert und Environment ist dazu gekommen.



    Hint: Manchmal ist es hilfreich die Dokumentation zu kennen. Und ja, die Doku ist scheiße ...

    Edited once, last by DeaD_EyE ().