Cronjob无法正确执行pythonscript?

时间:2015-08-01 12:22:41

标签: python linux cron

情况:

我的覆盆子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()

3 个答案:

答案 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时,我遇到了同样的问题。当我手动运行脚本时,我发现我输入的路径是错误的。