Cronjob "@reboot" - startet nicht

  • Hallo, ich habe einen Raspberry Pi 3B+ mit Raspbian Buster (Debian 10.0) als Betriebssystem. Ich hab alles upgedated und upgegradet.

    Jetzt habe ich ein Python-Script, dass ich immer bei Reboot ausführen lassen möchte.

    (Da drinnen frage ich einfach nur den status eines GPIO´s ab, an dem ein Taster hängt und der bei Tastendruck in eine Datenbank schreibt. Das funktioniert aber Problemlos und sollte nicht mein aktuelles Problem betreffen).

    Mein Aktuelles Problem ist, dass der Cronjob einfach nicht mein Python-Script ausführt. (Das merke ich, weil erstens keine Daten in meine Datenbank geschrieben werden und zweitens auf der Konsole auch nichts ausgegeben wird, was ich aber im pythonscript mache-> Aufruf von print("...") ).


    Ich habe folgendes gemacht:

    Als superuser habe ich mit crontab -e einen neuen Cronjob angelegt. Das steht drinnen:

    Code
    @reboot sudo python /home/pi/software/mein_python_script.py& > /home/pi/software/log_root.txt


    Wenn ich jetzt den crontab speichere und schließe, meldet mir die Console folgendes:

    Code
    crontab: installing new crontab


    Wenn ich jetzt reboote, dann steht in meinem log_root.txt (im Crontab oben definiert) nichts drinnen, was möglicherweise O.K. ist...ich weiß es nicht.


    Wenn ich aber nach dem Reboot den command

    Code
    grep cron /var/log/syslog


    ausführe, dann bekomme ich:

    Code
    Jul 27 13:59:58 raspberrypi cron[338]: (CRON) INFO (Running @reboot jobs)


    PS: ich habe nur diesen einen Cronjob in meinem crontab hinterlegt, wenn ich als root hineingehe. Als normaler User Pi hab ich keinen einzigen Cronjob.


    Mein Problem ist aber, dass mein Python-Script einfach nie aufgerufen wird.... Was hab ich vergessen? Was müsste noch gemacht werden ? :helpnew::helpnew::helpnew:


    Danke vielmals schon im Vorraus,


    LG

  • Wenn ich mich recht erinnere, geht ein Cronjob mit sudo nicht. Versuche es mal mit

    Code
    sudo crontab -e

    und trage die Zeile dort ein. Ich glaube, ich habe ein ähnliches Problem einstmals so gelöst.

  • Jetzt habe ich ein Python-Script, dass ich immer bei Reboot ausführen lassen möchte.


    ...


    Was müsste noch gemacht werden ?

    Z. B., verzichte auf den cronjob und starte dein python-Script bei Reboot, mit einer service- (und timer-)unit.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    • Official Post

    Als superuser habe ich mit crontab -e einen neuen Cronjob angelegt. Das steht drinnen:

    Code
    @reboot sudo python /home/pi/software/mein_python_script.py& > /home/pi/software/log_root.txt


    Ändere mal bitte die Zeile in

    Code
    @reboot sudo python /home/pi/software/mein_python_script.py >> /home/pi/software/log_root.txt 2>&1

    und berichte was in der Datei steht!


    Btw. Wenn Du die Crontab als root oder per sudo crontab -e geöffnet hast, dann ist sudo im Cronjob selber nicht nötig.

    Beim Autostart von Skripten ist die Angabe (auch im Skript) von absoluten Pfaden unumgänglich.

  • Andere Sache: Überprüfe die PATH-Zuweisung am Anfang der crontab. Bei mir steht da

    Code
    PATH=/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin

    Das hat bei mir viele Probleme gelöst.

    Edited once, last by Auerhahn ().

  • Code
    @reboot sudo python /home/pi/software/mein_python_script.py& > /home/pi/software/log_root.txt

    Mein Problem ist aber, dass mein Python-Script einfach nie aufgerufen wird....

    Es wird weder sudo, noch python aufgerufen, weil die crontab ohne den Suchpfad als Umebunvariable, abgearbeitet wird.[PATH=]

    sudo als User root ist ziemlich sinnbefreit.

    Für python musst Du den absoluten Dateipfad (laut < whereis pyrhon >) eintragen, oder dem Crontab Eintrag ein PATH=/usr/sbin:/usr/bin:/sbin:/bin voranstellen. Siehe < man 5 crontab >


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Hallo,


    wie ich dir im anderen Thread schon sagte: nimm' eine systemd Service Unit oder User Unit. je nach dem, wann du das Skript starten willst. Das ist nun mal der aktuelle weg, nicht das ältere cron.


    Und Python 2 ist Ende diesen Jahres EOL -> schreib' dein Skript auf Python 3 um.


    Gruß, noisefloor

  • und berichte was in der Datei steht!

    pi@raspberrypi:~/software $ nano log_root.txt

    Supi, danke vielmals, sehe, dass es bei mir an den SQL Zugriffsrechten liegt....:wallbash::danke_ATDE:

    PS: Der Verständlichkeit halber habe ich mein script hier im Forum "mein_python_script.py" genannt. Es heißt aber "machine_logger.py"

    PPS: Ich hab in meinem Python-Script einen SQL-Connector, der ein "SQL-Connector-Object" für den User root einrichtet und ich habe den Verdacht, dass der raspi nicht als root user bootet, sondern als standard "pi" ... ???

    Was aber wieder dagegen sprechen würde ist, dass wenn ich mich über SSH mit dem User "pi" auf den raspberry hänge, ich mit "python machine_logger.py&" mein python script starte und es dann aber auch ausgeführt wird und Zugriffsrechte auf die Datenbank hat und auch Daten reinschreibt.....;(

  • Falls es noch etwas zur Sache tut: Hier ist mein komplettes Python-Script:

    Ich Frage hier den Button-Status von zwei Buttons (Felix, Sofia) ab und Schreibe je nachdem, welchen Button man drückt ein Statement in eine SQL Tabelle


    • Official Post

    Das sieht imho so aus, als würde der DB (zu diesem Zeitpunkt noch) das Netzwerk fehlen.


    Wie Dein Skript erst dann startet wenn das Netzwerk vorhanden ist, können Dir am besten die User verraten, die Dir eine systemd Service Unit empfolen hatten.


    Du solltest dabei auch verstehen worum es dabei geht. Lektüre gibt es u.a. z.B. hier:

    https://wiki.ubuntuusers.de/systemd/Service_Units/

    https://wiki.archlinux.de/title/Systemd/Eigener_Service

    https://wiki.ubuntuusers.de/systemd/systemctl/

  • In der User-Crontab wird (und dazu gehört auch die vom User 'root') wird dieser Befehl nicht funktionieren.


    Die User-Crontab liest, erstellt, verändert man immer ohne 'sudo'

    crontab -l : Crontab anzeigen (lesen)

    crontab -e : Crontab erstellen/editieren


    Beendet man den Editor (welcher es ist, steht in der variablen $EDITOR), und hat etwas bei der Crontab geändert, wird sie gespeichert und dem Cron-Deamon gesagt, dass er die Daten neu lesen soll.


    Frage:

    Warum soll das bei einem Reboot ausgelöst werden? Wenn, dann ist das ein Ergebnis des Befehls 'reboot' (oder eines Äquivalenten Aufrufs) und wird beim Herunterfahren ausgeführt.


    (Wenn überhaupt, wäre das ein Eintrag in der System-/etc/crontab)

    Selber denken,
    wie kann man nur?

  • Laut < man 8 crontab >


    @reboot... Run once, at startup.


    Und der Zeitpunkt des durch @reboot bestimmten Programmes wird durch den Start des cron Dämons bestimmt.

    [Systemd kennt keine crontab, cton, anacron etc. mehr]


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Hallo,


    wenn das Skript ein vorhandenes Netzwerk braucht, dann starte es via systemd und trag' bei der `After` Direktive das network-online.target ein.

    Und da du dein Skript ja sowie so wegen dem EOL von Python 2 auf Python 3 umschreiben wolltest:

    • Nimm' das neuere, schönere, bessere gpiozero Modul statt das alte / veraltete RPi.GPIO Modul.
    • Eliminier' das `global` aus dem Code. Das ist schlechter Still, macht den Zustand des Programms undurchsichtig und in 99,9% der Fälle so wie so überflüssig.
    • Zeile 39+40 sind überflüssig, weil Python für Funktionen ohne expliziten Rückgabewert automatisch `None` zurück liefert.
    • if name != None: kann man einfacherer als if name: schreiben.


    Gruß, noisefloor