我经历过多个主题,但我似乎无法找到问题。
我正在构建一个非常简单的Twitter机器人,我想用Raspberry Pi的一个cron作业每小时开一次。这是我的crontab:
PYTHONPATH=/usr/bin/python
MAILTO=*myemail*
00 * * * * /home/username/directory/my_script.py >> /var/log/cron.log
然后是剧本:
#! /usr/bin/env python
import sys
from twython import Twython, TwythonError
from pymarkovchain import MarkovChain
#TWITTER ACCESS
apiKey = KEY
apiSecret = SECRET
accessToken = TOKEN
accessKey = KEY
#text to pull
text = open('/home/username/directory/text.txt').read()
#Generate database and frequency table
mc = MarkovChain('/home/username/directory/markov')
mc.generateDatabase(text)
tweet = mc.generateString()
api = Twython(apiKey,apiSecret,accessToken,accessKey)
try:
api.update_status(status=tweet)
except TwythonError as e:
print e
我检查的第一件事是我所有引用的文件,以确保它们是绝对引用。然后,我检查以确保我的文件路径是正确的。我真的很难过。使用完整路径从命令行运行脚本按预期工作。任何想法都表示赞赏。
答案 0 :(得分:2)
在尝试了上面的建议并阅读了无数文章之后,我了解到cron必须以root身份运行,而不是以用户身份运行。我检查了日志,发现调用脚本的用户是文件的所有者,而不是root用户。因此,运行chmod a+x my_script.py
会照顾它。
感谢所有建议 - 特别是那些将错误发送到正确的日志文件的建议。
答案 1 :(得分:0)
为了更好地调试,您可能需要重定向stderr:
00 * * * * /home/username/directory/my_script.py >> /tmp/cron.log 2>&1
# or
00 * * * * /home/username/directory/my_script.py >> /tmp/cron.log 2>/tmp/cron-error.log
(我还改变了那里的路径,以确保你的cron用户有权写出输出。)
您可以尝试的另一件事是在cron中使用Python运行脚本:
00 * * * * python /home/username/directory/my_script.py >> /tmp/cron.log 2>&1