ubuntu 如何为nodejs运行python脚本(如pm2)

0dxa2lsx  于 2022-11-22  发布在  Python
关注(0)|答案(7)|浏览(209)

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

我希望它能自动重启以防万一。

bvjxkvbb

bvjxkvbb1#

实际上,您可以从pm2中运行python脚本:

pm2 start echo.py

如果脚本以.py后缀结尾,默认情况下会使用python解释器。如果文件名不是以.py结尾,可以执行以下操作:

pm2 start echo --interpreter=python

我发现你必须小心你正在使用的python,特别是如果你正在使用一个与你机器上的“默认”python版本不同的virtualenv python。

pkln4tw6

pkln4tw62#

我创建了一个生态系统文件ecosystem.config.json

{
    "apps": [{
        "name": "app_name",
        "script": "/the/app/path/my_app.py",
        "args": ["-c", "my_config.prod.json"],
        "instances": "1",
        "wait_ready": true,
        "autorestart": false,
        "max_restarts": 5,
        "interpreter" : "/path/to/venv/bin/python",
    }]
}

运行pm2服务:

$ pm2 start ecosystem.config.json
$ pm2 -v
3.2.8
vaj7vani

vaj7vani3#

PM2就足够了,它将通过后缀运行解释器:

{
  ".sh": "bash",
  ".py": "python",
  ".rb": "ruby",
  ".coffee" : "coffee",
  ".php": "php",
  ".pl" : "perl",
  ".js" : "node"
}
j8ag8udp

j8ag8udp4#

带管道的PM2

对于那些试图从/用pipenv运行python程序的人,请尝试pm2.config.json(或PM2官方文档中的ecosystem.json.config),如下所示:
重要的部分是"interpreter" : "pipenv""interpreter_args": "run python3"
pm2.config.json

{
    "apps": [{
        "name": "BackupService",
        "script": "/home/service-backup/service/server.py",
        "args": [""],
        "wait_ready": true,
        "autorestart": false,
        "max_restarts": 5,
        "interpreter" : "pipenv",
        "interpreter_args": "run python3"
    }]
}

然后是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代表示例)

bwitn5fc

bwitn5fc5#

UPD:请参阅下面的答案以获得更好的解决方案。

有几种解决方案。首先,你可以使用http://supervisord.org/,这是一个体面的通用过程控制系统,它包括很多开箱即用的功能,如自动重启,重启计数器,日志,灵活的配置和更多。
除此之外,你可以将你的实现逻辑 Package 成一个函数,在try except块中运行它,捕获所有异常,当捕获到异常时,再次运行函数而不是退出脚本。在你的情况下,这样的函数可能包括创建侦听器,验证和流部分。

mqkwyuun

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"
我希望这个例子能有所帮助

ax6ht2ek

ax6ht2ek7#

你可以使用nohup- Nohup,no hang-up的缩写,是Linux系统中的一个命令,它可以在退出shell或终端后保持进程运行。Nohup可以阻止进程或作业接收SIGHUP(信号挂起)信号。这是一个在关闭或退出终端时发送给进程的信号。下面给出了一些nohup的基本命令。

nohup mycommand

   OR

 nohup python3 -m flask run &

相关问题