我用我的nodejs脚本pm2,我喜欢它。 现在我有一个收集EC2stream数据的Python脚本。 有时脚本会popup,我希望进程pipe理器像pm2一样自行重启。
python有没有和pm2一样的东西? 我一直在四处寻找,找不到任何东西。
这是我的错误
File "/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py", line 430, in filter self._start(async) File "/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py", line 346, in _start self._run() File "/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py", line 286, in _run raise exception AttributeError: 'NoneType' object has no attribute 'strip' /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:90:
这是一个简单的数据收集脚本
class StdOutListener(StreamListener): def on_data(self, data): mydata = json.loads(data) db.raw_tweets.insert_one(mydata) return True def on_error(self, status): mydata = json.loads(status) db.error_tweets.insert_one(mydata) if __name__ == '__main__': #This handles Twitter authetification and the connection to Twitter Streaming API l = StdOutListener() auth = OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) stream = Stream(auth, l) #This line filter Twitter Streams to capture data by the keywords: 'python', 'javascript', 'ruby' stream.filter(follow=[''])
我希望它只是重新启动自己的事情发生。
UPD:查看下面的答案以获得更好的解
–
有几个解决方案。 首先,您可以使用http://supervisord.org/这是一个体面的通用过程控制系统,它包括许多开箱即用的功能,例如自动重启,重启计数器,日志记录,灵活配置等等。
除此之外,您可以将您的实现逻辑封装到一个函数中,在try except
块内运行它,捕获所有异常,并在出现异常时再次运行该函数,而不是退出脚本。 在你的情况下,这样的功能可能包括创建监听器,认证和流部分。
你实际上可以在pm2中运行python脚本:
pm2 start echo.py
如果脚本以.py后缀结尾,则默认使用python解释器。 如果你的文件名不以.py结尾,你可以这样做:
pm2 start echo --interpreter=python
我发现你必须小心你正在使用的Python,特别是如果你正在使用一个不同版本的virtualenv python到你的机器上的'默认'python。
PM2就足够了,它会用后缀运行解释器:
{ ".sh": "bash", ".py": "python", ".rb": "ruby", ".coffee" : "coffee", ".php": "php", ".pl" : "perl", ".js" : "node" }
在我的情况下,我在我的项目中使用了维迪奇。 原来的命令是:
scrapyd --pidfile /var/log/scrapyd/twistd.pid -l /var/log/scrapyd/logs/scrapyd.log
而pm2版本是:
pm2 start scrapyd --interpreter python --watch --name=scrapyd -- --pidfile "/var/log/scrapyd/twistd.pid" -l "/var/log/scrapyd/logs/scrapyd.log"
希望这个例子可以帮助