我在Node.js脚本中使用了pm2
,我很喜欢它。
现在我有一个python脚本,它收集EC2上的流数据。有时脚本会崩溃,我希望进程管理器像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=[''])
我希望它能自动重启以防万一。
7条答案
按热度按时间bvjxkvbb1#
实际上,您可以从pm2中运行python脚本:
如果脚本以.py后缀结尾,默认情况下会使用python解释器。如果文件名不是以.py结尾,可以执行以下操作:
我发现你必须小心你正在使用的python,特别是如果你正在使用一个与你机器上的“默认”python版本不同的virtualenv python。
pkln4tw62#
我创建了一个生态系统文件
ecosystem.config.json
运行pm2服务:
vaj7vani3#
PM2就足够了,它将通过后缀运行解释器:
j8ag8udp4#
带管道的PM2
对于那些试图从/用pipenv运行python程序的人,请尝试pm2.config.json(或PM2官方文档中的ecosystem.json.config),如下所示:
重要的部分是
"interpreter" : "pipenv"
和"interpreter_args": "run python3"
。pm2.config.json
然后是
pm2 start pm2.config.json
。我总是pm2 delete BackupService
(或者你在“name”中叫它什么),在重新开始之前,因为即使有--update-env
标志,它也不使用更新的pm2.config.json
。不知道为什么。另请注意,根据最新的PM2文档,
"interpreter_args"
似乎已更改为"node_args"
。我运行的是pm2 --version
3.0.0,旧的方式仍然有效。带Python多处理功能的PM2
如果你想运行一个使用Pythons多处理库的python程序,解决方案是强制它在fork模式下运行。
然而,我怀疑,我们需要把多处理部分完全留给Python。我无法想象PM2能够管理由Python的多处理所产生的多个进程--当它在
cluster
模式下运行时,它会尝试这样做。而且,当使用"interpreter"
选项(例如pipenv)时,根据PM2文档,只有fork_mode
可以工作。因此,将
"exec_mode": "fork"
添加到您的pm2.config.json
以使其运行。如果不使用
pm2.config.json
文件,将-i 0
传递给pm2 start
也会强制fork模式。(-i代表示例)bwitn5fc5#
UPD:请参阅下面的答案以获得更好的解决方案。
有几种解决方案。首先,你可以使用http://supervisord.org/,这是一个体面的通用过程控制系统,它包括很多开箱即用的功能,如自动重启,重启计数器,日志,灵活的配置和更多。
除此之外,你可以将你的实现逻辑 Package 成一个函数,在
try except
块中运行它,捕获所有异常,当捕获到异常时,再次运行函数而不是退出脚本。在你的情况下,这样的函数可能包括创建侦听器,验证和流部分。mqkwyuun6#
在我的例子中,我在我的项目中使用了scrapyd。
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"
我希望这个例子能有所帮助
ax6ht2ek7#
你可以使用nohup- Nohup,no hang-up的缩写,是Linux系统中的一个命令,它可以在退出shell或终端后保持进程运行。Nohup可以阻止进程或作业接收SIGHUP(信号挂起)信号。这是一个在关闭或退出终端时发送给进程的信号。下面给出了一些nohup的基本命令。