Keine Logging-Ausgaben bei Script start über eine Systemd Unit!?

  • Hallo zusammen,


    wird folgendes Programm (Test des Logging-Moduls) über eine Systemd-Unit bei Pi-Start gestartet, wird keine Loggdatei erstellt!??

    Wird es manuell über die Konsole gestartet wird eine Loggdatei "programm.log" mit entsprechendem Eintrag erstellt und die Meldung ausgegeben, dass das Programm ausgeführt wurde.


    OS = Stretch (Nov.2018)


    Systemd Unit:

    Code
    1. [Unit]
    2. Description=Werkstattklima Service
    3. After=network.target
    4. [Service]
    5. Type=idle
    6. ExecStart=/usr/bin/python /home/pi/messen/Logging-Test.py
    7. [Install]
    8. WantedBy=multi-user.target

    pi@raspberrypi:~ $ sudo chmod 755 /etc/systemd/system/Werkstattklima.service

    pi@raspberrypi:~ $ sudo systemctl daemon-reload

    pi@raspberrypi:~ $ sudo systemctl start Werkstattklima.service


    Jetzt sollte die Loggingdatei im selben Verzeichnis wie die Scriptdatei "Logging-Test.py" erstellt werden!?

    Ein reboot blieb auch erfolglos. Der Pi ist so konfiguriert, dass er in die Konsole startet.


    Der Status der Unit ist folgender:

    Code
    1. pi@raspberrypi:~/messen $ sudo systemctl status Werkstattklima.service
    2. ● Werkstattklima.service - Werkstattklima Service
    3. Loaded: loaded (/etc/systemd/system/Werkstattklima.service; enabled; vendor preset: enabled)
    4. Active: inactive (dead) since Sat 2018-12-08 12:27:11 CET; 16s ago
    5. Process: 519 ExecStart=/usr/bin/python /home/pi/messen/Logging-Test.py (code=exited, status=0/SUCCESS)
    6. Main PID: 519 (code=exited, status=0/SUCCESS)
    7. Dez 08 12:27:10 raspberrypi systemd[1]: Started Werkstattklima Service.
    8. Dez 08 12:27:11 raspberrypi python[519]: Programm ausgeführt

    Da das Script nicht in einer Endlosschleife läuft wurde es einmal abgearbeitet. Sieht man ja auch an der Meldung "Programm ausgeführt"... Es wird nur keine Loggdatei erstellt!?


    Weis jemand Rat?


    Danke vorab schonmal!


    Gruß RM(:

  • stat /home/pi/programm.log

    Benutze absolute Pfade, ansonsten landen Dateien nicht zwingend dort, wo du sie erwartest.

    The S in IoT stands for Security

  • Hi llutz,


    mit absolutem Pfad zur Loggdatei funktioniert es jetzt.


    Ist schon verwirrend, bei "normalem" Scriptstart wird die Loggdatei im selben Verzeichnis wie das Script selbst angelegt und beim Start über die Systemd-Unit nicht. Den Fehler sucht mal erst mal wo anders als bei absoluten Pfadangaben :/...

    OK, wieder was gelernt... absolute Pfade verwenden!


    :danke_ATDE:


    Gruß RM

  • Wenn du das Script manuell so aufrufst, dürfte das Ergebnis gleich sein (Logfile landet im $HOME bzw. dem Verzeichnis, in dem du dich gerade befindest):

    /usr/bin/python /home/pi/messen/Logging-Test.py


    Du startest manuell aber wahrscheinlich eher so, oder:

    cd /home/pi/messen/

    python ./Logging-Test.py

    Denn dabei wäre das aktuelle Verzeichnis ($PWD) /home/pi/messen und somit landet auch das Logfile dort.

    The S in IoT stands for Security

  • Hast recht,


    mein Denkfehler war, dass ich dachte, das Loggfile landet automatisch auf der Verzeichnisebene des Scripts.

    Es landet aber im aktuellen Verzeichnis! das ist beim Starten über Systemd eben ein anderes..


    Zu gern würde mich noch interessieren, wo denn das Logfile fälschlicherweise gelandet ist? :/

  • Schätze in /root, da das der default User für deine Systemd-Unit ist und du keinen anderen User angibst.

    Also sudo stat /root/programm.log

    The S in IoT stands for Security

  • pi@raspberrypi:~/messen $ sudo stat /root/programm.log

    stat: der Aufruf von stat für '/root/programm.log' ist nicht möglich: Datei oder Verzeichnis nicht gefunden


    Da liegt sie nicht, na ja, nicht weiter schlimm..

  • Hallo,


    du kannst dem logging-Modul den Pfad, in dem das Skript liegt, mitgeben:


    Python
    1. import os
    2. current_path , _ = os.path.split(os.path.abspath(__file__))

    `current_path` enthält dann den absoluten Pfad, in dem das Skript liegt.


    oder, mit dem neueren pathlib Modul:

    Code
    1. import pathlib
    2. path = pathlib.Path(__file__)
    3. another_current_path = path.resolve().parent

    Gruß, noisefloor

  • Falls es dich interessiert, ...


    Es besteht auch die Möglichkeit das du das Log System von systemd benutzt. Die Logs lassen sich dann mittels journalctl betrachten.

    Hab mir hierfür ein Modul vorbereitet, welches dann selbstständig prüft, ob das eigentliche Skript manuell oder per Systemd aufgerufen worden ist, Abhängig dessen erfolgt dann die Ausgabe der Logmeldung in systemd oder per Stream (kann man aber auch nach belieben noch anpassen)

    Logging mit systemd-python

    und

    Doppeltes Fehlerlogging mit Systemd