MySQL auslesen und für Cronjob ändern/anpassen

  • Hallo,


    Ich habe ein Problem mit crontab im Python.

    Ich habe ein Script, was mir zwei Werte aus einer MySQL DB ausliest.

    Ein wert für "Stunde" und einer für "Minute".

    Diese werden dann weiter verarbeitet und mittels crontab in die System Crontab geschrieben.


    Funktioniert auch soweit ganz gut.


    Jetzt soll ein zweiter Crontab geschrieben werden, der etwas anderes zur gleichen Zeit schaltet.

    Crontabs werden auch super geschrieben. Es kommt aber kein Ergebnis aus dem PI.

    Ich habe festgestellt, das es Probleme damit gibt, die Tabs zur gleichen Zeit auszuführen.

    Ich bekomme es aber jetzt in der Python nicht hin, das der ausgelesene Wert aus der MySQL um 1 verändert werden kann.


    Es soll halt dann in der Contab so aussehen:

    Code
    00 9 * * * /var/www/html/20.sh
    01 9 * * * /var/www/html/41.sh


    Hier mein Script:



    Ich habe folgendes versucht:


    Code
    job = cron.new(command='/var/www/html/40.sh',comment='LIFIan1')
    job.hour.on(ha)
    job.minute.on(ma+1)

    und auch:


    Code
    ma1 = ma+1
    job = cron.new(command='/var/www/html/40.sh',comment='LIFIan1')
    job.hour.on(ha)
    job.minute.on(ma1)


    werden aber beide Varianten nicht akzeptiert.

    Wie kann ich den Ausgelesenen Wert der MySQL Tabelle eventuell noch manipulieren?


    System:


    Pi 3b

    Raspian

    MySQL Datenbank

    Python 2

  • Hallo,


    dein Fehler ist, dass du in Zeile 29 das überschreibst, was du in Zeile 23 anlegst. `job` kann halt nur einen Wert haben... Wenn du in Zeile 26 ein `cron.write()` einfügst sollte klappen.


    Sonst noch: `except: nothing` ist kein valides Python und wirft einen Fehler, falls der `except` Zweig wirklich mal betreten wird. Nackte except sind so wie so schlecht, man fängt gezielt Fehler ab.


    Das Verzeichnis /var/www/html ist für Dateien für den Webserver gedacht - klar funktioniert das, ist aber a) stilistisch schlecht und b) kann man zu ggf. den Inhalt des Shellskripts auslesen. Was ggf. einen neuen Angriffsvektor auf deine Raspi offenbart.


    Du importierst das `time` Modul und benutzt es nicht. Du importierst `mysql.connector` und benutzt es nicht (das ist von `import mysql` abgedeckt).


    Das `LIMIT 0,1` in beiden SQL Statement ist eigentlich überflüssig, weil du mit `fetchone()` so wie so nur einen Wert abholst.


    Das `exit()` am Ende des Skripts ist a) völlig überflüssig und b) ein nicht-dokumentiertes Feature von Python - was man schon alleine deshalb nicht benutzen möchte.


    Gruß, noisefloor

  • Hallo Noisefloor.


    Danke, das du dich mit dem Script so auseinander gesetzt hast, ich werde deine Hinweise definitiv mit einarbeiten/berichtigen.


    Das Problem was ich habe, ist nicht das Script an sich. die Crons werden erstellt. Ich habe das Problem das Mein Pi es nicht schaft die beiden Scripte aus der Cron gleichzeitig laufen zu lassen. Deswegen wollte ich, das einer der beiden Befehle im Script um 1 Minute verschoben wird.


    Es sind zwei verschiedene Crontab. Einmal der LIFIan und der LIFIan1


    Das heist, es wird mit dem Script A (was oben aufgeführt ist) einmal täglich die MySQL DB abgefragt.


    Diese erstellt dann 2 Crontabs, die eine für Script B und eine für Script C


    Script B und C können nicht gleichzeitig ausgeführt werden, da nur ein Script auf den 433 Mhz Sender zugreifen kann.


    Deswegen soll erst B und dann eine Minute später C starten.


    habe die Werte in der Crontab mal von Hand geschrieben dann funktioniert das auch. Halt wenn der Versatz von 1 Minute ist.


    Ich wollte halt das in dem Script A jetzt im Bereich der Crontab Erstellung er ma+1 rechnet. dies will er aber nicht machen....

  • Hallo,


    Quote

    Ich wollte halt das in dem Script A jetzt im Bereich der Crontab Erstellung er ma+1 rechnet. dies will er aber nicht machen....

    Ja - und warum das so ist (nach meinem Verständnis des Skripts habe ich dir in Post #2 geschrieben.


    Quote

    Es sind zwei verschiedene Crontab. Einmal der LIFIan und der LIFIan1

    Wie du die Einträge nennst ist Latte - der Fehler ist, dass du beide Einträge an die selbst Instanz des `CronTab` Objekt bindest (um es mal ganz formell auszudrücken ;-) ).

    Quote

    habe die Werte in der Crontab mal von Hand geschrieben dann funktioniert das auch. Halt wenn der Versatz von 1 Minute ist.

    Weil du von Hand auch wohl tatsächlich zwei Einträge vornimmst. Dein Skript A macht aber nur einen. Siehe oben.


    Gruß, noisefloor

  • Ok, das hätte ich jetzt auch vollkommen anders verstanden.

    Setz doch bei Skript C einfach ein time.sleep(60)

    1. werden Shell-Skripte ausgeführt -> da gibt's kein time.sleep(60)

    2. Selbst wenn du in das Shell-Skript einen korrekten Befehl zum pausieren von X Sekunden einbaust ist das ein Würg-Around und keine Lösung des Problems.


    Gruß, noisefloor

  • Hallo,


    ich nochmal... Irgendwie habe ich das Gefühl, das wir aneinander vorbei reden....(schreiben)

    das Script funktioniert ja soweit.

    Es werden zwei Crontab mit zwei verschiedenen Befehlen in die CronDatei geschrieben.


    Ich habe es jetzt gemacht wie oben geschrieben und das zweite:


    Code
    cron.write() 


    eingefügt.

    Jetzt habe ich als Ergebnis immer noch die zwei gleichen befehle in der Crondatei.


    Ich will ja aber wissen wie ich den zweiten veränder.


    Code
    >>> a = 1
    >>> b = 1+1
    >>> print(a,b)
    1,2
    >>>

    so sieht es jetzt in der crondatei aus:


    Code
    00 9 * * * /var/www/html/20.sh
    00 9 * * * /var/www/html/41.sh

    und so soll das Ergebnis aussehen.


    Code
    00 9 * * * /var/www/html/20.sh
    01 9 * * * /var/www/html/41.sh


    Bei dem versuch:


    Code
    job.minute.on(ma+1)


    gibt es nur einen Fehler: need string or buffer.

    Und da liegt halt mein Hauptproblem. Weil ich das zweite "ma" nicht nachbearbeitet bekomme.


    Bitte haut mich nicht wenn ich grade zu Blöd bin. :helpnew::helpnew::helpnew:

  • Hallo,


    dann habe ich das in der Tat falsch verstanden... Wobei es mich nach wie vor wundert, weil `job` überschrieben wird, bevor die crontab gespeichert wird...


    Ist die DB von dir, sprich hast du sie angelegt oder ist das was, was von einem "externen" Programm generiert wird, so dass du keinen Einfluss auf das Tabellendesign hast?


    Gruß, noisefloor

  • Hallo,


    geht ne gibts ne: hast du das Skript aus deinem Eingangspost selber geschrieben? Dann solltest du auch so viel Python könnten, dass du aus dem Stehgreif weißt, wie man einen String in einen Integer oder Float wandelt. Das sind absolute Python-Grundlagen...


    Gruß, noisefloor

  • Integer: int()

    Float: float()

    String: str()


    Integer sind Ganzzahlen, Float eine Gleitkommezahl, und String ein Text.

    So wie das bei dir der Fall ist, kann eine Zahl auch als Text formatiert sein, dann ist es aber nicht möglich Berechnungen damit anzustellen, um dies zu ermöglichen muss der Datentyp erst umgewandelt werden. Hingegen kann kein Buchstabe als Integer oder Float konvertiert werden, hierbei würdest du einen Fehler verursachen.