crontab - wie trage ich ein Python3 Programm korrekt ein?

  • Hallo zusammen,
    die Sache mit den Cronjobs hört sich ja immer einfach an. Scheint in Wirklichkeit aber doch etwas tricky zu sein...
    Ich krieg zwei Python3-Scripte nicht automatisch gestartet.
    Wär super, wenn mir da mal jemand etwas auf die Sprünge helfen könnte... :)


    Hab hier zwei Python3-Progrämmchen.
    Diese sind mit [chmod +c] lauffähig gemacht und in der Kommandozeile oder direkt aus Geany heraus laufen die auch und machen was sie sollen.
    Dabei hab ich Geany extra auf default Python 3 gestellt und in der Kommandozeile mach ichs einfach so, dass ich zuvor ins entsprechende Verzeichnis wechsle und dort das jeweilige Kommando für die Programme eingeb:

    Code
    pi@raspberrypi:~ $ cd SPRRD
    pi@raspberrypi:~/SPRRD $ python3 Graph_cron_alle.py
    pi@raspberrypi:~/SPRRD $ python3 ftp_upload_graphen.py


    für die crontab-Datei Verzeichnis [/etc/crontb] gelingt es mir jedoch nicht, die richtige Syntax zu finden.
    Es passiert einfach nix. Im Moment hab ich dort folgende Einträge, wobei die letzten beiden Zeilen von mir sind, alles andere war scheinbar schon drin:


    Hatte auch schon probiert, das "python3" hinter das letzte Slash zu stellen. Ohne Erfolg.
    Kennt sich da jemand aus? Was ist das Geheimnis??
    ;)

  • Hallo Raspbuino,



    Was ist das Geheimnis??
    ;)


    Da gibt es kein Geheimnis ... Die Antwort gibst Du Dir doch selber schon:



    Diese sind mit [chmod +c] lauffähig gemacht und in der Kommandozeile oder direkt aus Geany heraus laufen die auch und machen was sie sollen.
    Dabei hab ich Geany extra auf default Python 3 gestellt und in der Kommandozeile mach ichs einfach so, dass ich zuvor ins entsprechende Verzeichnis wechsle und dort das jeweilige Kommando für die Programme eingeb:


    Was meinst Du wohl, in welchem Verzeichnis sich Dein System befindet - in dem Moment, wenn es Dein Script starten soll? Wahrscheinlich ganz woanders...


    Und deswegen ist es unabdingbar, dass Du in Deinem Skript absolute Pfade verwendest. Das heißt, egal, in welchem Verzeichnis Du Dich befindest, kannst Du das Script aufrufen - und es funktioniert immer auf dieselbe Weise... Ganz ohne jegliche Magie.


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas ().

  • Hallo Andreas,
    vielen Dank für die schnelle Antwort!
    Okay - ich habs mal so jetzt versucht (die Minuten etwas angepasst, weil ich ja keine Stunde warten wollte):

    Code
    37 * * * * /home/pi/SPRRD/python3 Graph_cron_alle.py
    
    
    38 * * * * /home/pi/SPRRD/python3 ftp_upload_graphen.py


    Hat leider noch nicht funktioniert...aber ich hoffe, ich bin ganz nah dran :)
    Bei der Pfadangabe scheint jetzt immer noch was nicht zu stimmen.
    Muss vor das "/home..." noch was anderes vornedran?

  • "/home/pi/SPRRD/python3" ist ja auch Quatsch. Wenn, dann den absoluten Pfad zum Interpreter "python3", aber das ist in diesem Fall i.d.R. nicht nötig. Also wenn dann "/usr/bin/python3" als absoluter Pfad zur Binary des Interpreters.


    Dein Script liegt in dem Benutzerverzeichnis von pi, diesen absoluten Pfad musst du angeben, denn sonst weiß crontab nicht wo diese Datei liegt - da sie nicht in einer PATH Umgebung liegt.


    15 * * * * pi python3 /home/pi/SPRRD/Graph_cron_alle.py


    war soweit also korrekt.


    Wichtig ist aber in 99% der Fälle was in der Script-Datei drin steht.
    Vermutlich hast du dort vergessen ebenfalls absolute Pfade zu Dateien zu hinterlegen aber dann werden "Graph"en im falschen Verzeichnis erzeugt.


    Wenn du das Script manuell ausführst, begibst du dich erst in das Verzeichnis /home/pi/ . Führst du dann das Script aus werden Dateien ohne absoluten Pfad im aktuellen abgelegt/erzeugt. Über crontab gehst du aber nicht in das Verzeichnis...
    Das kannst du einfach mal testen indem du vor dem manuellen ausführen ins Verzeichnis /tmp/ wechselst und dann mit Angabe des absoluten Pfads zur Scriptdatei dieses ausführst

    Code
    cd /tmp
    python3 /home/pi/SPRRD/Graph_cron_alle.py

    Sofern das Script irgendwelche Dateien erzeugt aber keine absoluten Pfade angegeben sind, werden die dann in /tmp/ erzeugt... Und genau das musst du korrigieren, im Script selbst.

  • Tja..ich steh wohl aufm Schlauch.
    Die Sache mit den Verzeichnissen scheint ja nicht ganz so einfach zu sein
    Nun ja, ich hoffe, ihr habt noch ein wenig Geduld mit mir.
    Die erste auszuführende Datei hat am Anfang folgenden Inhalt (der Rest wiederholt sich im Grunde).

    Python
    #!/usr/bin/python3
    
    
    import rrdtool
    gbreit = "600"
    ghoch = "300"
    Zeitstart1 = "-3h"
    ....
    rrdtool.graph("UPLOAD/graph_03h_tempout.gif", "--start",Zeitstart1,...
      ....)


    Das auszuführende Script (Graph_cron_alle.py) liegt im Verzeichnis [/home/pi/SPRRD]
    Da gibts dann einen weiteren Ordner "UPLOAD", in den die Graphen reingeschrieben werden, s. Code oben.
    In sofern hab ich im Code dann ja auch nur den relativen Pfad angegeben und das funktioniert auch.
    Es müßte aus crontab heraus doch möglich sein, ein Script an beliebiger Stelle mit python3 zu starten.
    Sorry, ich kann leider noch nicht erkennen, was da jetzt falsch ist. Aber irgendwas muss schließlich falsch sein.
    Noch was Interessantes dazu:
    Hab grad mal ausprobiert, ob ich das Script in Ordner SPRRD direkt vom home-Verzeichnis aus gestartet bekomme. Sieht ganz danach aus, dass zwar versucht wird, das Script zu starten, es wird also gefunden, aber offensichtlich wird versucht, mit Python2 zu starten, denn in diesem Fall bekomme ich ne Fehlermeldung, dass im Code was nicht stimmt.

    Code
    pi@raspberrypi:~/SPRRD $ cd
    pi@raspberrypi:~ $ cd SPRRD
    pi@raspberrypi:~/SPRRD $ python3 Graph_cron_alle.py
    pi@raspberrypi:~/SPRRD $ cd
    pi@raspberrypi:~ $ python3 SPRRD/Graph_cron_alle.py
    Traceback (most recent call last):
     File "SPRRD/Graph_cron_alle.py", line 26, in <module>
       "TEXTALIGN:left")
    rrdtool.OperationalError: opening 'RRD_tempout.rrd': No such file or directory


    Habs noch nicht hingekriegt. Krieg ich vielleicht noch nen Tip?
    Oder muss das auszuführende Python-3- Script woanders liegen, damit es von crontab gestartet werden kann?
    Die Graphen hab ich auch in keinem anderen Verzeichnis finden können (zumindest nicht da, wo ich denke, wo sie potentiell liegen könnten, wenn ich was mit den Pfadangaben falsch gemacht hatte).


    Das mit CD /tmp hab ich mal ausprobiert. Da kommt die selbe Fehlermeldung wie oben. Wird also wahrscheinlich auch versucht, in Python2 zu starten.

    Code
    pi@raspberrypi:~ $ cd /tmp
    pi@raspberrypi:/tmp $ python3 /home/pi/SPRRD/Graph_cron_alle.py
    Traceback (most recent call last):
     File "/home/pi/SPRRD/Graph_cron_alle.py", line 26, in <module>
       "TEXTALIGN:left")
    rrdtool.OperationalError: opening 'RRD_tempout.rrd': No such file or directory
    pi@raspberrypi:/tmp $


    Kann man dem Raspi irgendwo, ähnlich wie das bei Geany geht, defaultmäßig Python3 zu interpretieren und nicht Python2? Dann müßte das doch auch gehen....
    :denker:

  • Hallo Raspbuino,


    in #2 habe ich und in Beitrag #5 hat Meigrafd Dir empfehohhlen, konsequent absolute Pfade einzusetzen.


    Ds Verzeichnis UPLOAD ist ein relativer Pfad und funktioniert nur in dem Pfad, in dem auch UPLOAD vorhanden ist. Von keinem anderen Verzeichnis aus gestartet läuft Dein Skript. Weder von der Konsole aus noch über Crontab.



    Suche bitte nach

    Code
    Linux absoluter Pfad
    Linux relativer Pfad

    um Dir der Unterschiede bewusst zu werden. Und dann setze das Gelernte bitte konsequent in Deinem Skript um.


    Wenn Dein Skript ausführbar ist, wenn Dein Shebang auf Pythoin 3 verweist, dann wird es wohl auch Python 3 starten. Es gibt keine Veranlassung etwas anderes zu starten.


    Du bekommst deswegen Fehlermeldungen beim Start aus /tmp heraus, weil ... ach, das müsstest Du jetzt eigentlich verstanden haben. Es gibt /tmp kein Verzeichnis UPLOAD und anderes, was Dein Skript zu erwarten scheint.



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas ().

  • UPLOAD/graph_03h_tempout.gif


    Ist kein absoluter Pfad. Ein absoluter beginnt mit dem Wurzelverzeichnis: /
    Absolut wäre dann also:


    /home/pi/UPLOAD/SPRRD/graph_03h_tempout.gif


    ...Unter Vorbehalt, da ich keine Ahnung hab ob dieser Pfad wirklich existiert...



    Zeig doch mal bitte deine Scripte - vollständig. Dann hätte dieses ewige raten ein Ende und man könnte dir konkret und exakt sagen wie es richtig auszusehen hat.

  • Das hat nichts mit 2 oder 3 zu tun, Du rufst das Skript ja explizit mit python3 auf. Das Problem ist - wie von den anderen schon geschrieben - der relative Pfad zur Datenbank. Du öffnest in Deinem Skript wahrscheinlich irgendwo RRD_tempout.rrd - das musst Du durch /absoluter/pfad/zu/RRD_tempout.rrd ersetzen.

  • Okay, der Reihe nach.
    Die Pfade und den Code hab ich oben veröffentlicht Ich machs nochmal hier an einer Stelle möglichst kompakt, so das alle beisammen ist:
    1.) das auszuführende Python3-Script liegt hier:
    /home/pi/SPRRD/Graph_cron_alle.py
    2.) In folgendem Verzeichnis sollen die Graphen abgelegt werden:
    /home/pi/SPRRD/UPLOAD
    3.)Der auszuführende Code in "Graph_cron_alle.py" sieht so aus:


    Da hab ich jetzt den relativen Pfad gegen einen absoluten eingetauscht:


    Das klappt nach Start direkt aus Geany genauso wie mit dem relativen Pfad.
    Also hab ich jetzt probiert, das Script mal so im LXTerminal mit absolutem Pfad zu starten.
    Klappt leider nicht, gibt ne Fehlermeldung:

    Code
    pi@raspberrypi:~ $ python3 /home/pi/SPRRD/Graph_cron_alle.py
    Traceback (most recent call last):
     File "/home/pi/SPRRD/Graph_cron_alle.py", line 26, in <module>
       "TEXTALIGN:left")
    rrdtool.OperationalError: opening 'RRD_tempout.rrd': No such file or directory
    pi@raspberrypi:~ $


    Das sind doch jetzt aber an den entscheidenden Stellen absolute Pfade, oder nicht??
    Aber die Fehlermeldung erinnert mich direkt an die Probleme, die ich hatte, als ich noch nicht die rrdtool-Variante für Python3 hatte...
    :s

  • :D :bravo2:
    BINGO! Hatte wohl noch zu wenig Kaffee...
    Hab den wegdererkenntnis mal auch an dieser Stelle (weiter unten im Code unter "DEF...") hinzugefügt:


    Der Graph wurde generiert, nachdem ich das Script dann so aufgerufen hatte:

    Code
    pi@raspberrypi:~ $ python3 /home/pi/SPRRD/Graph_cron_alle2.py
    
    
    pi@raspberrypi:~ $


    (ist ne Kopie von der ursprünglichen Datei, die nur nen Teil des Codes enthält, da ich nicht gleich alle relevanten Stellen ändern wollte, um das auszuprobieren. Deswegen die 2 am Ende...).
    So...da habt ihr mir ja echt heut was beigebracht.
    :danke_ATDE: :danke_ATDE: :danke_ATDE: ...vor allem für die Geduld!
    Sobald ich auch den cron job hinbekommen habe (muss vorher noch ein bissl den kompletten Code ergänzen), kann ich hoffentlich die finale Erfolgsmeldung bringen. Schau mer mal. Bin guter Dinge jetzt.
    Automatisch zusammengefügt:[hr]
    Subber!
    Crontab funktioniert jetzt:


    10 * * * * pi python3 /home/pi/SPRRD/Graph_cron_alle.py
    11 * * * * pi python3 /home/pi/SPRRD/ftp_upload_graphen.py


    Es lag nur an den absoluten Pfaden, die ich nicht überall berücksichtigt hatte.


    :thumbs1: