py script per crontab -> Fehler?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich habe ein simples py-script geschrieben, welches vcgencmd get_throttled ausliest und in eine logfile schreiben soll:

    Wenn ich dieses manuell ausführt funktioniert das problemlos:

    Code
    sudo python pwr.py


    Nun möchte ich dieses script per crontab minütlich ausführen lassen, mit folgendem crontab -e Eintrag im pi benutzen:

    Code
    * *     * * * sudo python /home/pi/pwr.py

    Nur hier wird das script scheinbar nicht richtig ausgeführt.
    1. in der Logfile erscheint kein Eintrag
    2. Nachdem das crontab einmal ausgeführt wurde, muss ich feststellen dass zb die WLAN Verbindung nichtmehr funktioniert.
    3. Im syslog sehe ich nur folgenden Eintrag:

    Code
    CRON[740]: (pi) CMD (sudo python /home/pi/pwr.py)
    
    
    kernel: [ 1797.125261] gpiomem-bcm2835 3f2000000.gpiomem: gpiomem device spend.

    Kann mir jemand ein Tipp geben, was hier schief läuft und was ich ändern muss?

    Edit:
    Systeminfo:
    Raspberry Pi 3
    Jessie Version 8
    Firmware: 4.4.26-v7+


    Viele Grüße
    vga

    Einmal editiert, zuletzt von dr.vga (26. November 2016 um 14:52)

  • Hallo vga,

    schreibe so

    Code
    * *     * * * sudo /Pfad/zum/Verzeichnis/in/dem/python/steckt/python /home/pi/pwr.py


    Das Verzeichnis verrät Dir

    Code
    which python

    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

    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.

  • Danke, habe den Pfad angepasst:

    Code
    * *     * * * sudo /usr/bin/python /home/pi/pwr.py

    Am verhalten hat sich leider nichts geändert, immer noch genauso wie beschrieben ;/

  • Dein Script ist fehlerhaft. Es fehlt die Ausführung der main() Funktion.

    Immer zuerst das Script manuell ausführen mit der exakt gleichen Befehls-Zeile wie du vor hast in Crontab einzutragen. Wenn es manuell nicht funktioniert kann crontab nämlich auch nicht zaubern.

    Davon abgesehen halte ich es für suboptimal ein Python Script zu verwenden um einen bash Befehl auszuführen. Wieso trägst du nicht einfach den Befehl direkt in crontab ein und lässt die Ausgabe in dein Logfile umleiten? :-/

    Crontab des root Benutzers bearbeiten:

    Code
    sudo crontab -e

    Eintrag:

    Code
    * * * * *    echo $(date +"%d.%m.%Y %H:%M:%S" ; vcgencmd get_throttled) >> /var/log/pwr.log

    Problematisch wird es allerdings wenn dein Pi 24/7 läuft, oder allgemein sehr lange. Denn dann wird das Logfile unkontrolliert ziemlich groß. Du solltest also auch noch eine rsyslog Regel einrichten um das Logfile zB ein mal pro Woche oder beim erreichen einer gewissen Größe zu rotieren. Siehe dazu: RaspberryPI Hosting/Housing [Diskusionen/Fragen]

  • Hallo vga,

    dann bringe mal ein wenig mehr Infos.

    Denn


    3. Im syslog sehe ich nur folgenden Eintrag:

    Code
    CRON[740]: (pi) CMD (sudo python /home/pi/pwr.py)
    
    
    kernel: [ 1797.125261] gpiomem-bcm2835 3f2000000.gpiomem: gpiomem device spend.

    3f200000 (mit 5 statt 6 Nullen!) ist die Adresse GPIO_PERI_BASE (Adressbereich zur Ansteuerung der GPIOs auf Prozessorebene). Damit das Ganze auch nach Einsatz eines Betriebssystems funktionieren kann, wird mittels [font="Courier New"]mmap()[/font] die Adresse im UserLand ermittelt, damit Bibliotheksroutinen auch GPIOs setzen oder lesen können.

    :s

    In Deinem Code wird allerdings kein GPIO angesprochen... keine derartige Bibliothek geöffnet. Kein entsprechender Befehl abgesetzt.

    Welche Infos behältst Du für Dich? Eine weitere Hilfe ist so jedenfalls nicht möglich.

    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

    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.

    Einmal editiert, zuletzt von Andreas (26. November 2016 um 15:37)

  • sorry, my fault!

    Ich hatte zuvor noch ein anderes script getestet, welches ich per /etc/crontab eingebunden hatte, welches eben auf die GPIO Pins zugegriffen hat.
    Darauf bin ich erst wieder gestoßen, nachdem ich das neue script statt mit crontab -e auch im /etc/crontab ausführen wollte.

    Sorry, aber trotzdem vielen Dank für deine Unterstützung Andreas!

  • :ich habe ein sehr ähnliches Problem.

    habe zu testzwecken das Script test.py erstellt.

    Code
    sudo nano test.py


    das Script enthält lediglich


    Code
    touch '/home/pi/test'

    dieses habe dann ausführbar gemacht.

    Code
    chmod +x ./test.py

    erfolgreich getestet über:

    Code
    sudo ./test.py

    den Pfad von Python gefunden über

    Code
    which python


    Crontab erstellt mit

    Code
    crontab -e
    Code
    */1 * * * * /usr/bin/python /home/pi/test.py

    in der Logfile (/var/log/cron.log finde ich zwar folgenden Hinweis aber ich verstehe gerade nicht warum die Datei nicht angelegt wird.

    Code
    Dec 7 23:20:01 raspberrypi CRON[2646]: (pi) CMD (/usr/bin/python /home/pi/test.py)
    Dec 7 23:20:01 raspberrypi CRON[2639]: (CRON) info (No MTA installed, discarding output)


    In einem Zweizeiler sollte sich eigentlich kein Fehler verstecken, oder ist es schon so spät :)


    vielleicht entscheidend

    OS = Raspian Jessie - 23.09.2016
    Python v.2.7.9

    Grundsätzlich wollte ich natürlich ein anders Script einbinden aber zunächst sollte es vielleicht mit der test.py klappen.

  • Auch wenn Dein Problem irgend wie mit "crontab" zu tun hat wäre es besser wenn Du für Dein Individuelles Problem einen Eigenen Thread erstellen würdest.


    :ich habe ein sehr ähnliches Problem.

    habe zu testzwecken das Script test.py erstellt.

    Code
    sudo nano test.py

    das Script enthält lediglich

    Code
    touch '/home/pi/test'

    dieses habe dann ausführbar gemacht.

    Code
    chmod +x ./test.py

    erfolgreich getestet über:

    Code
    sudo ./test.py

    Das kann so nicht funktionieren...
    1. ist "touch" ein Konsolen Befehl und kein Python Befehl, also wenn dann bash, üblicherweise mit Dateiendung *.sh und eben als Interpreter: sh oder bash
    2. hast du "sudo" genutzt um die Scriptdatei zu erstellen, also gehört die Datei dem root Benutzer aber beim "chmod" hast du kein "sudo" davor, also würde chmod als pi ausgeführt werden aber der darf nicht einfach die Dateirechte eines fremden Users verändern.
    3. Hast du kein Shebang definiert und somit kann eine direkte Ausführung ala " ./test.py " nicht funktionieren - welcher Interpreter soll den Inhalt der Datei verarbeiten?

    Wenn ich die exakt selben Befehle ausführe wie du hier beschreibst sieht das bei mir so aus:

    Code
    pi@raspberrypi:~$ sudo nano test.py
    pi@raspberrypi:~$ chmod +x ./test.py
    chmod: changing permissions of ‘./test.py’: Operation not permitted
    pi@raspberrypi:~$ 
    pi@raspberrypi:~$ python test.py 
      File "test.py", line 1
        touch '/home/pi/test'
                            ^
    SyntaxError: invalid syntax
    pi@raspberrypi:~$

    Wenn das Script manuell nicht funktioniert kann Crontab auch nicht zaubern.


    PS: Mit einem Python Script ein anderes Python Script über suprocess o.ä. auszuführen ist eine Todsünde. Sowas macht man nicht - sondern man importiert das andere Script und führt dann Funktionen o.ä. des anderen Scripts aus.
    Es ist mir nicht bekannt solch ein Script veröffentlicht zu haben, obwohl mir viele Zeilen sehr bekannt vor kommen :denker:

  • Hi,
    danke erstmal für deine Antwort.
    beim nächsten mal werde ich selbst ein Thema erstellen, ich wollte das Forum nur nicht überfluten.

    zu 1.)
    du hast nattürlich recht, ich wollte auch nur "testen" ob ich generell einen .py in einen Crontab implimentieren kann. Da das "echte" Script ja nunmal im Phyton ist.
    Die Mailabfrage die durchgeführt werden soll kann ich nicht so einfach überwachen.
    Ob eine Datei erzeugt wurde schon.
    Daher der Touch-befehl.


    zu 2.)
    auch hier hast du recht ich habe im Terminal nachgesehen ich habe tatsächlich

    Code
    sudo chmod +x ./test.py


    eingegeben.

    zu 3.) den Shebang

    Python
    #!/usr/bin/python


    habe ich entfernt
    da das Script dann nicht mehr funktionierte wenn ich es über

    Code
    sudo ./test.py


    ausgeführt habe.
    Vermutlich weil Touch, wie du schreibst, kein Pyhtonbefehl ist.
    Ich werde es mal mit open versuchen.


    das Script hat funktioniert und eine Datei im richtigen Ordner erzeugt nur über Crontab will das ganze nicht funktionieren.


    das Script ist von Dir/Ihnen siehe:
    Raspberry per Mailbefehl steuern


    Da der Thread tot schien und die Frage unbeantwortet blieb, wollte ich den Vorschlag mit dem Crontab umsetzten.

    Einmal editiert, zuletzt von EscoR (8. Dezember 2016 um 20:29)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!