通过cron运行的Python脚本不会偶尔执行
问题描述:
我有一个简单的python脚本来获取推文并将它们缓存到配置为每隔两分钟通过cron运行的磁盘。通过cron运行的Python脚本不会偶尔执行
*/2 * * * * (date ; /usr/bin/python /path/get_tweets.py) >> /path/log/get_tweets.log 2>&1
该脚本大部分时间都能成功运行。然而,脚本经常不执行。除了其他日志记录之外,我在脚本之上添加了一个简单的打印语句,除了从初始日期命令输出到日志之外,没有任何内容。
#!/usr/bin/python
# Script for Fetching Tweets and then storing them as an HTML snippet for inclusion using SSI
print "Starting get_tweets.py"
import simplejson as json
import urllib2
import httplib
import re
import calendar
import codecs
import os
import rfc822
from datetime import datetime
import time
import sys
import pprint
debug = True
now = datetime.today()
template = u'<p class="tweet">%s <span class="date">on %s</span></p>'
html_snippet = u''
timelineUrl = 'http://api.twitter.com/1/statuses/user_timeline.json?screen_name=gcorne&count=7'
tweetFilePath = '/path/server-generated-includes/tweets.html'
if(debug): print "[%s] Fetching tweets from %s." % (now, timelineUrl)
def getTweets():
request = urllib2.Request(timelineUrl)
opener = urllib2.build_opener()
try:
tweets = opener.open(request)
except:
print "[%s] HTTP Request %s failed." % (now, timelineUrl)
exitScript()
tweets = tweets.read()
return tweets
def exitScript():
print "[%s] Script failed." % (now)
sys.exit(0)
tweets = getTweets()
now = datetime.today()
if(debug): print "[%s] Tweets retrieved." % (now)
tweets = json.loads(tweets)
for tweet in tweets:
text = tweet['text'] + ' '
when = tweet['created_at']
when = re.match(r'(\w+\s){3}', when).group(0).rstrip()
# print GetRelativeCreatedAt(when)
# convert links
text = re.sub(r'(http://.*?)\s', r'<a href="\1">\1</a>', text).rstrip()
#convert hashtags
text = re.sub(r'#(\w+)', r'<a href="http://www.twitter.com/search/?q=%23\1">#\1</a>', text)
# convert @ replies
text = re.sub(r'@(\w+)', r'@<a href="http://www.twitter.com/\1">\1</a>', text)
html_snippet += template % (text, when) + "\n"
#print html_snippet
now = datetime.today()
if(debug): print "[%s] Opening file %s." % (now, tweetFilePath)
try:
file = codecs.open(tweetFilePath, 'w', 'utf_8')
except:
print "[%s] File %s cound not be opened." % (now, tweetFilePath)
exitScript()
now = datetime.today()
if(debug): print "[%s] Writing %s to disk." % (now, tweetFilePath)
file.write(html_snippet)
now = datetime.today()
if(debug): print "[%s] Finished writing %s to disk." % (now, tweetFilePath)
file.close()
sys.exit(0)
任何想法?该系统是一个使用python 2.4运行Centos 5.3的VPS。
更新:我已经添加了整个脚本以避免混淆。
答
最可能的解释是,偶尔脚本需要两分钟以上的时间(也许系统偶尔会很忙,或者脚本可能需要等待某些偶尔会遇忙的外部站点等),并且您的cron的a明智的,可以跳过尚未终止的重复事件。通过记录脚本的起始和结尾时间,您可以仔细检查是否属于这种情况。在这种情况下你想要做的事情取决于你(我建议你考虑跳过偶尔的跑步以避免进一步超载一个非常繁忙的系统 - 你自己的或者你从中获取数据的远程系统)。
答
我刚刚遇到了一个Python脚本的问题,它有时不会在crontab中运行,但总是从命令行运行。原来我不得不将日志重定向到/dev/null
。标准输出似乎已经满了,程序刚好停止,进程终止。使用/dev/null
转储输出,一切都很好。
在各个点上都存在整个python脚本的日志记录,但在由crond产生的进程挂起的实例中,没有任何来自python脚本的行被记录或执行。 – gcorne 2010-05-07 01:22:23
@gcome,如果您没有记录上一次运行的确切开始和结束时间,则无法检查我的假设(即结束时间是在下一次运行的其他计划运行时间之后)是否正确。 – 2010-05-07 03:27:01
我已经添加了整个脚本,它显示了我在何处/如何记录脚本中采取的各种操作。在我对日志的分析中,最后一个事件的时间(写入完成)在下一个cron开始时间的开始之前完成。尽管如此,我会看看你的建议是否成功。 – gcorne 2010-05-07 22:49:29