Crontab bringt nach Neustart mySQL Fehler bei Python

  • Hallo Zusammen,


    ich habe ein kleines Pythoon3 Programm laufen..


    es beginnt wie folgt:

    Python
    import requests
    from bs4 import BeautifulSoup
    from datetime import datetime
    import os
    import mysql.connector as database
    .....


    Es gleicht ein paar Inhalte aus Datenbanken miteinander ab.


    Jetzt wollte ich, dass beim Neustart vom Pi alles gleich von selbst wieder startet:

    Code
    sudo crontab -e

    Dort rein habe ich folgendes geschrieben:

    Code
    # m h  dom mon dow   command
    @reboot sleep 30 && /usr/bin/python3 /home/user/Scripte/datenabgleich.py > /home/user/cronjoblog 2>&1

    Es funktioniert nur leider nicht.

    Also wenn ich:

    Code
    python3 /home/user/Scripte/datenabgleich.py

    eingebe, rennt es sofort los. Aber nicht nach dem neustart.

    Da steht in der log die ich beim cronjob ausgeben lasse folgendes:


    Code
    Traceback (most recent call last):  File "/home/user/Scripte/datenabgleich.py", line 5, in <module>    import mysql.connector as database
    ModuleNotFoundError: No module named 'mysql'

    Händisch starten kann ich es ohne Probleme nach dem Neustart.

    Aber leider nicht automatisch.


    Kann mir jemand helfen.

  • Händisch starten kann ich es ohne Probleme nach dem Neustart.

    Als root oder als $USER?

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

  • Als $USER

    Deine crontab ist aber eine root-crontab.

    Kann es evtl. auch sein, dass es (nur) dann funktioniert, wenn der user eingeloggt/angemeldet ist?

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

  • Bin kein Pro, daher nur ein paar Fragen:

    Code
    python3 /home/user/Scripte/datenabgleich.py

    funktioniert also, funktioniert auch folgendes?

    Code
    /usr/bin/python3 /home/user/Scripte/datenabgleich.py

    Ich würde sicherstellen, dass die Befehle identisch sind. Also was per Terminal direkt geht, auch so in den Cronjob kommt.


    Ansonsten editierst Du mit "sudo crontab -e" auch den Cronjob für den "root"-User. Um zu testen ob es als dieser funktioniert, würde ich folgendes testen:

    Code
    sudo /usr/bin/python3 /home/user/Scripte/datenabgleich.py

    Ggf. existiert das modul für root bzw. sudo nicht.


    Du könntest aber auch den Cronjob für den selben User aus dem Terminal anlegen mit "crontab -e" (ohne sudo).


    Ich vermute einen der folgenden Gründe und eine Kombination aus diesen:

    • als welcher user es ausgeführt wird, also "user" (ohne sudo) oder "root" (mit sudo)
    • ob das modul "mysql" im jeweiligen fall existent ist oder nicht
    • wie die pfade (zu python, zum script oder den modulen) und berechtigungen da jeweils sind
    • oder dass unmittelbar beim/nach dem reboot gewisse Ding noch nicht verfügbar sind (dann zeitverzögerung vergrößern)


    Aber Rasp-Berlin hat auch 'nen guten Ansatz. Baue ein .sh-Script das sauber funktioniert. Also root, oder ein anderer User. Und dann nutze dessen Cronjob um dieses .sh-Script auszuführen.

  • # m h dom mon dow command

    @reboot sleep 30 && /usr/bin/python3 /home/user/Scripte/datenabgleich.py > /home/user/cronjoblog 2>&1

    und wieder einer, der denkt, man könne ein Skript "zeilenmäßig" in der Crontab starten.


    Weshalb kannst du nicht ganz einfach, z.B. ein Bash-Skript erstellen, das dir das sauber durchführt:


    Code
    # m h  dom mon dow   command 
    @reboot /home/user/Scripte/datenabgleich.sh > /home/user/cronjoblog 2>&1

    und in /home/user/Scripte/datenabgleich.sh schreibst du dann rein, was für ein aus der Cron gestarteten Skript so alles wichtig ich.

    Wie eine Umgebung, in der dieses Skript alle die Umgebungsvariablen vorfindet, die es braucht, um zu funktionieren.


    Dass ein Skript auch aus der Crontab des Users gestartet wird, der die Daten ausführen soll/kann, und nicht zum Beispiel als "root" aus dem Home-Verzeichnis eines anderen Users, und dann in dieses Verzeichnis vielleicht auch noch mit "root"-Rechten Dateien ablegt, sollte doch langsam auch hier bekannt sein, oder?

    Computer ..... grrrrrr

  • Baue ein .sh-Script das sauber funktioniert.

    BTW: Es geht auch ohne .sh-Script, wenn man statt dem cronjob, eine service-unit benutzt.

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