Python Python-Script via Cronjob startet nicht

Fabian0787

Cadet 4th Year
Registriert
Jan. 2014
Beiträge
96
Hallo Community,

ich habe ein Problem auf meinem Raspberry Pi. Es werden keine Scripte über die Cronjobs ausgeführt. Wenn ich als User "Pi" in der Shell den Befehl eintrage, funktioniert es tadellos.

Bitte um Hilfe! :)

Ausgabe bei sudo crontab -e:

Code:
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

SHELL=/bin/sh:/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

* * * * * pi bash /home/pi/systemok_call.sh

Das Shellscript war jetzt nur als Umweg gedacht. Das eigentliche Script ist in Python geschrieben.

Dort versuchte ich es direkt über:

Code:
*/2 * * * * pi /usr/bin/python /home/pi/systemok.py >/dev/null 2>&1

Übersehe ich etwas? Weder das Shellscript als auch das Python-Script wird nicht ausgeführt... :( :( :(

Es läuft auf meinem RasPi --> Raspbian GNU/Linux 8 (jessie) und bislang keine weitere Anwendung


Grüße
Fabian
 
Bin mir ziemlich sicher, dass das "pi bash" im shellscript/cron bzw. das "pi" beim py-aufruf/cron das problem ist.

Der Cron-daemon wird das als anfang des commands interpretieren, und "pi" gibt es nicht.

Versuch mal entweder:

* * * * * /home/pi/systemok_call.sh
(dazu sollte das shebang im shellscript gesetzt sein btw.)

oder:

*/2 * * * * /usr/bin/python /home/pi/systemok.py >/dev/null 2>&1
 
Danke für die flotte Antwort,

im Python-Script habe ich oben:

#!/usr/bin/python


das Shellscript beginnt mit dem shebang:

#!/usr/bin/python

Ist das so korrekt?

Grüße
Fabian
 
Beim python würde ich sagen ist okay, aber unnötig, da du das .py-script ja eh mit "/usr/bin/python" davor startest.

Beim shellscript sollte es allerdings so aussehen:
#!/bin/bash

Denn das Shellscript wird von der Shell ausgeführt und nicht von Python.
Aktuell versucht der cron also (neben der inkorrekten Syntax zum aufruf) das .sh-Skript mit Python auszuführen was vermutlich in die Hose geht.
 
Code:
#!/usr/bin/env python

als Alternative mal getestet?

Edit: und chmod gesetzt für die Skripts?
 
Zuletzt bearbeitet:
Du hast natürlich Recht :freak: , das war jetzt nur ein Copy&Paste-Fehler von mir.

Es lautet auch #!/bin/bash

Das Script wird aber nicht ausgeführt... :(
Ergänzung ()

prog.ger schrieb:
Code:
#!/usr/bin/env python

als Alternative mal getestet?

Edit: und chmod gesetzt für die Skripts?


Hallo prog.ger,

ich habe beides versucht. Die Rechte sind gesetzt chmod a+x ...... :)
 
Hallo zusammen,

mittlerweile wird ein Cronjob bei mir gestartet.

sudo crontab -e:

Code:
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
SHELL=/bin/sh:/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#@reboot /usr/bin/python /usr/scripts/stromausfall.py
* * * * * /usr/bin/python /home/pi/scripts/systemok.py
* * * * * /usr/bin/python /home/pi/scripts/cputemp.py
* * * * * /usr/bin/python /home/pi/scripts/speicherplatz.py
#

systemok.py :
Code:
#!/usr/bin/python

fehlercode = 0
if fehlercode == 0:
        fehlercode = str(0)
        import smtplib
        smtpUser = 'XXXXXX'
        smtpPass = 'XXXXXX'
        toAdd = ['XXXXXX', 'XXXXXX']
        fromAdd = 'XXXXXX'
        subject = 'BATL0001 [Status: ' + fehlercode + ']'
        header = 'To: ' + ", ".join(toAdd) + '\n' + 'From: ' + fromAdd + '\n' + 'Subject: ' + subject
        body = fehlercode
        print header + '\n' + body
        s = smtplib.SMTP('smtp.googlemail.com',587)
        s.ehlo()
        s.starttls()
        s.ehlo()
        s.login(smtpUser, smtpPass)
        s.sendmail(fromAdd, toAdd, header + '\n\n' + body)
        s.quit()

Dieser Code geht per Cronjob und wird ausgeführt, die Mail wird problemlos verschickt.

cputemp.py :

Code:
#!/usr/bin/python

import sys, os
os.system("sh cputemp.sh")

tempobj = open("cputemp.txt")
for line in tempobj:
        temp = line.rstrip()
tempobj.close()

temperatur = float(temp)

temperaturschwelle = 45
if temperatur>temperaturschwelle:
        fehlercode = str(13)
	import smtplib
	smtpUser = 'XXXXXX'
	smtpPass = 'XXXXXX'
	toAdd = ['XXXXXX', 'XXXXXX']
	fromAdd = 'XXXXXX'
	subject = 'BATL0001 [Status: ' + fehlercode + ']'
	header = 'To: ' + ", ".join(toAdd) + '\n' + 'From: ' + fromAdd + '\n' + 'Subject: ' + subject
	body = fehlercode
	print header + '\n' + body
	s = smtplib.SMTP('smtp.googlemail.com',587)
	s.ehlo()
	s.starttls()
	s.ehlo()
	s.login(smtpUser, smtpPass)
	s.sendmail(fromAdd, toAdd, header + '\n\n' + body)
	s.quit()

Das zweite Script funktioniert leider nicht. Ein drittes was so ähnlich aufgebaut ist ebenfalls nicht... :(


Hier die Fehlerlogs vom Crontab:

May 10 13:54:12 batl0001 crontab[3640]: (root) BEGIN EDIT (root)
May 10 13:54:35 batl0001 crontab[3640]: (root) REPLACE (root)
May 10 13:54:35 batl0001 crontab[3640]: (root) END EDIT (root)
May 10 13:55:01 batl0001 cron[3285]: (root) RELOAD (crontabs/root)
May 10 13:55:01 batl0001 CRON[3666]: (root) CMD (/usr/bin/python /home/pi/scripts/systemok.py)
May 10 13:55:01 batl0001 CRON[3667]: (root) CMD (/usr/bin/python /home/pi/scripts/cputemp.py)
May 10 13:55:01 batl0001 CRON[3669]: (root) CMD (/usr/bin/python /home/pi/scripts/speicherplatz.py)
May 10 13:55:01 batl0001 CRON[3654]: (root) MAIL (mailed 239 bytes of output but got status 0x0001 from MTA#012)
May 10 13:55:01 batl0001 CRON[3655]: (root) MAIL (mailed 216 bytes of output but got status 0x0001 from MTA#012)
May 10 13:55:03 batl0001 CRON[3656]: (root) MAIL (mailed 111 bytes of output but got status 0x0001 from MTA#012)

Ich weiß, es ist nicht schön programmiert, aber es sollte doch im Prinzip laufen?!

Bitte erneut um Hilfe!

Viele Grüße
Fabian
Ergänzung ()

Guten Morgen,

kann mir denn niemand helfen :( ?

Grüße
Fabian
 
Das erste Skript schickt eine Mail? Die anderen beiden nicht?

Das erste Skript schickt immer eine Mail. Das zweite nur wenn eine Temperaturschwelle überschritten ist.

Wurde lokal getestet, dass die Temperaturbestimmung funktioniert und die Schwelle so niedrig ist, dass eine Mail generiert wird?
 
Guten Morgen,

ich habe die Schwelle für die Temp. absichtlich niedrig angesetzt. Es sollte momentan immer eine Mail verschickt werden, mein Raspi ist die letzten 2 Tage immer über 45°C warm. Die Text-Date cputemp.txt wird auch richtig ausgefüllt mit dem hohen Temperaturwert.

Wenn ich da Script in der Shell direkt ausführe wird die Mail auch versendet. Daher ist die Bedingung denke ich korrekt.

Grüße
Fabian
 
Ich würde testweise die Schwelle auf 0 setzen, damit die Nachricht auch wirklich immer verschickt wird.

Außerdem würde ich die tatsächliche Temperatur ausgeben und in eine Logdatei schreiben.

Code:
* * * * * /usr/bin/python /home/pi/scripts/cputemp.py > /enter-path-to/logfile.log
 
Hallo soares,

ich habe mein Script zusätzlich noch angepasst, jetzt sollte immer eine Mail erzeugt werden:

Code:
#!/usr/bin/python

import sys, os
os.system("sh cputemp.sh")

tempobj = open("cputemp.txt")
for line in tempobj:
        temp = line.rstrip()
tempobj.close()

temperatur = float(temp)

temperaturschwelle = 40

if temperatur>temperaturschwelle:
        fehlercode = str(13)
else:
        fehlercode = str(0)

import smtplib
smtpUser = 'XXXXXXXX'
smtpPass = 'XXXXXXXX'
toAdd = ['XXXXXXXX', 'XXXXXXXX']
fromAdd = 'XXXXXXXX'
subject = 'BATL0001 [Status: ' + fehlercode + ']'
header = 'To: ' + ", ".join(toAdd) + '\n' + 'From: ' + fromAdd + '\n' + 'Subject: ' + subject
body = fehlercode
print header + '\n' + body
s = smtplib.SMTP('smtp.googlemail.com',587)
s.ehlo()
s.starttls()
s.ehlo()
s.login(smtpUser, smtpPass)
s.sendmail(fromAdd, toAdd, header + '\n\n' + body)
s.quit()

Kann es an den Imports liegen oder dass ich aus Python heraus eine Sh-Script ausführe?

Grüße
Fabian
 
Naheliegend wäre ein Problem mit Pfaden. Man sollte immer absolute Angaben machen. Aber open() müsste fehlschlagen, wenn die Datei nicht gefunden werden kann. Hm. Ich würde trotzdem bei beiden Aufruf mal absolute Pfade versuchen.
 
soares schrieb:
Naheliegend wäre ein Problem mit Pfaden. Man sollte immer absolute Angaben machen. Aber open() müsste fehlschlagen, wenn die Datei nicht gefunden werden kann. Hm. Ich würde trotzdem bei beiden Aufruf mal absolute Pfade versuchen.

Das war die Lösung bei dem Script! :)

Danke soares! :D

Jetzt muss ich nur noch herausfinden, wieso der Crontab nicht arbeitet wenn ich einen Reboot vom System mache....
 
Zurück
Oben