情况:
我的覆盆子pi上有一个python脚本。如果我手动执行它没有任何问题,它的工作方式完全符合预期。
当我用:
创建一个cron作业时sudo crontab -e
脚本被“执行”,因为它在正确的时间出现在/ var / log / syslog中。其他cron作业正确执行。
我的参赛作品:
0 18 * * * /usr/bin/python /home/user/script.py
在日志中它是正确的:每天18:00:00。但没有任何反应。 我不知道为什么脚本没有正确执行。
这可能是一个愚蠢的错误,但我并不擅长linux。
script.py:
#!/usr/bin/python
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from datetime import *
import datetime
import sys
import site
import logging
MailReceiveSRV = 'imap.gmail.com'
MailSendUSER = 'abc@gmail.com'
MailSendPWD = 'pw!'
MailSendSRV = 'smtp.gmail.com'
MailSendFROM = MailSendUSER
def readFile():
"""
Liest die txt Datei ein und gibt ein Array von Arrays zurueck. In jedem Subarray steht ein Abholtag.
"""
file = open("/home/pi/Termine_2015.txt", "r")
all_dates = []
for line in file:
all_dates.append(line.split(";"))
return all_dates
def sendMail(subj, msg, MailSendTO):
"""
Send Mails ueber abc
"""
try:
# E-Mail zusammensetzen
mime = MIMEMultipart()
mime['From'] = MailSendFROM
mime['To'] = MailSendTO
mime['Subject'] = Header(subj, 'utf-8')
mime.attach(MIMEText(msg, 'plain', 'utf-8'))
# Mail versenden
smtp = smtplib.SMTP(MailSendSRV)
smtp.starttls()
smtp.login(MailSendUSER, MailSendPWD)
smtp.sendmail(MailSendFROM, [MailSendTO], mime.as_string())
smtp.quit()
except Exception, e1:
print "Error in sendMail: " + str(e1)
def checkPaperGreenYellowRedXmas(dates):
"""
checkt ob das morgige Datum in der Liste der Arrays auftaucht. Falls ja gehen Mails raus
"""
tomorrow = str(datetime.datetime.today() + timedelta(days=1))[:10]
for date in dates:
if date[2] == tomorrow:
subject = "Muell-Erinnerung! Morgen kommt " + date[0]
body = date[0] + "\n\n" + date[1] + "\n\nWo? -> " + date[3]
sendMail(subj=subject, msg=body, MailSendTO="x@web.de")
sendMail(subj=subject, msg=body, MailSendTO="y@gmx.de")
return True
return False
def checkBlackBrown():
"""
checkt auf Mittwoch + geradeWoche, wenn ja kommt braun
checkt auf Mittwoch + ungeradeWoche, wenn ja kommt schwarz
"""
wednesday = lambda x: x==2
tomorrow = datetime.date.today() + timedelta(days=1)
evenWeek = lambda x: x % 2 == 0
subj_braun = "Muell-Erinnerung! Morgen kommt Braun"
subj_schwarz = "Muell-Erinnerung! Morgen kommt Schwarz"
body_braun = "Braune Tonne\n\nWo? -> Vor der Haustuer"
body_schwarz = "Schwarze Tonne\n\nWo? -> Vor der Haustuer"
if wednesday(tomorrow.weekday()) and evenWeek(tomorrow.isocalendar()[1]):
sendMail(subj=subj_braun, msg=body_braun, MailSendTO="x@web.de")
sendMail(subj=subj_braun, msg=body_braun, MailSendTO="y@gmx.de")
return True
elif wednesday(tomorrow.weekday()) and not evenWeek(tomorrow.isocalendar()[1]):
sendMail(subj=subj_schwarz, msg=body_schwarz, MailSendTO="x@web.de")
sendMail(subj=subj_schwarz, msg=body_schwarz, MailSendTO="y@gmx.de")
return True
return False
def Main():
paths = site.getsitepackages()
for path in paths:
sys.path.append(path)
logging.basicConfig(filename='muell.log',
format='%(levelname)s %(asctime)s :: %(message)s',
level=logging.DEBUG)
PaperGreenYellowRedXmas = readFile()
x = checkPaperGreenYellowRedXmas(PaperGreenYellowRedXmas)
y = checkBlackBrown()
if x or y:
logging.info("Process finished.. mail sent.")
else:
logging.info("Process finished.. no mail sent.")
if __name__ == '__main__':
Main()
答案 0 :(得分:1)
使用crontab运行脚本时似乎发生了一些不好的事情。尝试这个,然后转到输出文件以了解实际发生的事情(此命令将stdout和stderr重定向到文件):
{{1}}
答案 1 :(得分:0)
如果要导入模块,请确保它们可以访问。
如果无法访问,请使用sys.path
将模块的绝对路径附加到列表sys.path.append(path)
。
答案 2 :(得分:0)
当我遇到此问题时,我只需执行命令并在命令行中运行它。它会告诉我正在发生的错误。
/usr/bin/python /home/user/script.py
当我拿到Raspberry Pi时,我遇到了同样的问题。当我手动运行脚本时,我发现我输入的路径是错误的。