如何为nodejs运行类似pm2的python脚本

2024-05-23 15:38:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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=[''])

我希望它能重新启动以防发生什么事情。


Tags: pyself脚本datalibpackagesusrlocal
3条回答

实际上,您可以在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"
}

UPD:关于更好的解决方案,请参见下面的答案。

--

有几种解决办法。首先,您可以使用http://supervisord.org/这是一个不错的通用进程控制系统,它包含许多现成的功能,如自动重新启动、重新启动计数器、日志记录、灵活配置等等。

除此之外,您可以将实现逻辑包装成一个函数,在try except块中运行它,捕获所有异常,当异常出现时,再次运行该函数,而不是退出脚本。在您的例子中,这样的功能可能包括创建侦听器、身份验证和流部分。

相关问题 更多 >