cron job zum Ausführen eines python scripts

  • Hallo Leute,

    ich habe ein Skript erstellt, das die Daten eines Sensors ausliest und diese in eine Datenbank schreibt. Nun sollen die Daten in bestimmten zeitlichen Abständen erfolgen. Für den Anfang mal jede Minute (oder auch schneller, um die Ergebnisse besser zu sehen). Die Idee dabei ist einen cron-job zu verwenden.


    Leider war mein Versuch erfolglos. Ich weiß, das Thema wurde schon öfter hier im Forum angesprochen. Aber irgendwie läuft es trotzdem nicht. Deswegen beschreibe ich mal Schritt für Schritt, was ich gemacht habe, und hoffe, dass jemandem der Fehler auffällt.

    Das script an sich funktioniert. Hier ist es:

    Den Cron-Job habe ich folgendermaßen angelegt:

    crontab -e

    und am Ende folgendes eingetragen:

    Code
    * * * * * /usr/bin/python3 /home/pi/Python/influxdb_bme280.py  > /home/Python/influxdb-cron.log


    Muss noch irgendwas zusätzlich gemacht werden?

  • Sollte das "/usr/bin/python3" nicht als erstes in dem Skript stehen?

    Nee, muss es nicht. Ein Shebang braucht man nur, wenn man das Skript direkt ausführt, ohne vorangestellten Aufruf des Python-Interpreters.


    olflab : was heißt genau "funktioniert nicht"? Wird gar nichts in die DB geschrieben? Auch nicht in der 2., 3., ... Minute?


    Stand der Dinge ist auch eher, dass man eine systemd Timer Unit nimmt. Cronjobs werden von systemd auch nur in Units gewandelt. Mit einer eigenen Unit hast du mehr Kontrolle. Und wenn was schief läuft bekommst du Logging via systemd ins Journal.


    Wenn du aus deinem Skript heraus loggen willst, solltest du das `logging`Modul von Python benutzen statt das selber mit `print` und einer Umleitung zu basteln.


    Das Postfix `...value` bei den datapoints->fields ist auch eigentlich Quatsch. Was soll der Wert den sonst sein außer ein Wert? Klar, es könnte theoretisch die Einheit sein - aber dass sieht man ja am Wert, dass es keine Einheit sein kann.


    Gruß, noisefloor

  • was heißt genau "funktioniert nicht"?

    Stimmt, habe ich nicht beschrieben. Wenn ich das Script manuell ausführe, werden die Werte in die DB geschrieben. Mit cron wird kein Wert in die DB geschrieben.

    Stand der Dinge ist auch eher, dass man eine systemd Timer Unit nimmt.

    Ok. Wie würde es in meinem Fall aussehen? Ich kenne mich damit nicht aus.

  • Hallo,


    hast du denn mal geprüft, ob der Cronjob überhaupt ausgeführt wird? Cron sollte ja nach syslog loggen.


    Zu systemd Units gibt es hier auch etliche Threads im Forum, gerade in Bezug auf "Timer Unit" statt Cron. Einfach mal die Forensuche bemühen. Oder im Wiki von ubuntuusers.de nachlesen: wiki.ubuntuusers.de/systemd . Was da steht gilt weitestgehend auch für Raspberry OS.


    Gruß, noisefloor

  • Warum überhaupt Cron?! Wenn man eh schon ein Skript geschrieben hat, kann man zur besseren Kontrolle/Übersichtlichkeit auch gleich das Logging, wie noisefloor schon geschrieben hat, und die Zeitintervalle dort steuern.

  • Hallo,


    Manul : sowohl unter Raspbian Buster als auch Ubuntu 18.04 gibt es den `cron.service` OOTB, nachinstalliert habe ich dafür nichts. Bei Ubuntu gibt es zusätzlich OOTB noch eine anacron.timer Unit, die habe ich unter Raspbian nicht.


    Gruß, noisefloor

  • Ich weiß nicht warum, aber jetzt scheint alles zu funktionieren. Das script wird jede Minute ausgeführt. Dabei werden die Messwerte in die Datenbank übertragen. Warum es vorher nicht funktioniert hat, weiß ich nicht.

    Da fehlt was zwischen /home und /Python :geek:

    Das war ein guter Hinweis. Die zu schreibenden Daten werden jetzt in die log-Datei geschrieben.


    Ich werde bei Gelegenheit auch mal die Systemd units mal ausprobieren.