Erzeugung log-Datei durch service

  • Hallo,

    ich habe ein Python3-Prog , das wahlweise zu debugging-Zwecken eine log-Datei erzeugt mit print (..., file=log). Beim Start im Terminal funktioniert das problemlos. Es soll aber letztlich als service laufen, dann funktioniert es nicht mehr. Ich habe es schon mit StandardOutput= null und StandardOutput=file:<Pfad> versucht, der serivice erzeugt nichts.

    Der service läuft mit user=pi, das python-Prog und die log-Datei hat den gleichen owner, auch Schreibrechte auf die log-datei sind vorhanden. Woran kann es liegen?

    Gruss, wonk :danke_ATDE:

  • Hallo,

    grundsätzlich: für's Logging gibt es das Python logging Modul, das standardmäßig an Board ist.

    Was für ein Objekt ist `log` bei dir? Hat `log` eine `write` Methode? Sonst kann das sowieso nicht funktionieren. Wenn es aktuell nicht funktioniert solltest du im Journal von systemd eine Fehlermeldung finden.

    Temporäres Schmalspurlogging kann man auch so machen, dass man einfach `print` Funktionen seinen Code einbaut, ohne `file=...` oder so. Wenn ein Python-Skript als Service Unit läuft, landen standardmäßig alle Ausgaben von `print` im zentralen Log von systemd, den du mit journalctl abfragen kannst. Aber, wie gesagt, richtiges Logging besser mit dem logging Modul implementieren.

    Gruß, noisefloor

  • Hallo,

    würde ich im Prinzip gern. Aber leider geht es mir als Linux-dummy öfters so, dass ich alles mögliche gegoogelte (oder aus dem Forum) probiere, bis es funktioniert. Dann weiß ich nicht mehr, was letztlich der entscheidende Schritt war, und es kann auch sein, dass ich zuvor irgendwann die richtige Lösung schon hatte, aber wegen eines anderen elementaren Fehlers übersehen hatte. Es ist dann selbst nachträglich schwierig, den eigentlichen Fehler zu finden.

    Ich weiß, spricht nicht gerade für eine systematische Arbeitsweise. Aber leider ist der Weg über ein systematisches Verständnis aller relevanten Linux-Arbeitsweisen zu weit für mich, vermutlich auch für viele andere.

    Deswegen auch nochmals danke für die Unterstützung

    Gruss, wonk :danke_ATDE:

  • Hallo,

    kann ich gern machen:

    [Unit]
    Description=sperre.py
    After=syslog.target network.target ntp.service rc-local.service

    [Service]
    Type=simple
    User=pi
    WorkingDirectory= /home/pi/
    ExecStart=/home/pi/sperre.py
    StandardOutput=file:/home/pi/sperre.log
    #StandardOutput=null

    [Install]
    WantedBy=multi-user.target

    Aber es kommt sicherlich zusätzlich auf den owner und die Rechte an den Dateien an:

    *.service: owner root, lesbar

    *.py: owner pi, lesbar, ausführbar

    *.log: owner pi. lesbar schreibbar, ausführbar

    Gruss, wonk :danke_ATDE:

  • Aber es kommt sicherlich zusätzlich ...

    BTW: Siehe z. B. für deinen Fall, auch bzgl. " user-unit vs. User=<user>".

  • Aus Neugier habe ich das Ganze jetzt mal nachvollzogen und richtig geraten. Meine Vermutung war das alte Leid der fehlenden Pfade und deshalb hatte ich die Angabe von WorkingDirectory= vorgeschlagen. Mein Testumfeld ist ein einfaches Python-Skript:

    Die abschließende Service Unit ist auch einfach:

    Getestet habe ich nur durch Starten der Unit mit sudo systemctl start logfiletest.service , also kein Autostart enabled usw.

    Also... Wenn im Skript die Zeile 6 aktiv ist (so wie aktuell oben), dann startet die Service Unit so wie sie ist das Skript und erzeugt die Logdatei.

    Ist die Zeile 7 aktiv, dann passiert nichts dergleichen. Dann hilft allerdings WorkingDirectory=/home/hyle/skripte in der Service Unit. Damit wird die Logdatei wieder erstellt.

  • Wenn ich in der log.service den User= weglasse, schreibt systemd bei mir ins Wurzelverzeichnis '/'. Nur wenn ich einen User= verwendet, der dort keine Schreibrechte hat, wird keine Log-Datei erstellt. Das Problem sollte man auch im Journal angezeigt bekommen: bei mir log.txt: Keine Berechtigung

    Aber generell gilt natürlich immer: absolute Pfade oder ein explizites Arbeitsverzeichnis mit angeben. Und auf die Berechtigungen achten. ;)

    Gruß Martin

    meine Test-Unit:

    Bash
    # systemctl cat log
    # /etc/systemd/system/log.service
    [Unit]
    Description=Log - Test
    
    [Service]
    #User=alarm
    #ExecStart=/home/alarm/bin/log.py
    ExecStart=/usr/bin/bash -c 'while true; do echo Hallo >> log.txt; sleep 5; done'

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!