40

我已经使用pm2了我的 Node.js 脚本,我喜欢它。
现在我有一个 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=[''])

我希望它在发生某些事情时重新启动。

4

7 回答 7

101

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

pm2 start echo.py

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

pm2 start echo --interpreter=python

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

于 2015-12-09T21:32:30.777 回答
14

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

{
  ".sh": "bash",
  ".py": "python",
  ".rb": "ruby",
  ".coffee" : "coffee",
  ".php": "php",
  ".pl" : "perl",
  ".js" : "node"
}
于 2016-09-29T02:49:37.510 回答
11

我创建了一个回声系统文件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
于 2019-01-16T13:48:30.503 回答
10

PM2 与 pipenv

对于那些试图从/使用pipenv运行 python 程序的人,请尝试使用pm2.config.json(或 PM2 官方文档中的生态系统.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(或者你用“名字”称呼它的任何东西),因为即使使用--update-env标志它也不会使用更新的pm2.config.json. 不知道为什么。

另请注意,根据最新的 PM2 文档, "interpreter_args", 似乎已更改为。"node_args"我正在运行pm2 --version3.0.0,旧方式仍然有效。

使用 Python 多处理的 PM2

如果你想运行一个使用 Python 多处理库的 python 程序,解决方案是强制以fork模式运行它。clusterPM2,如果没有另行通知,似乎会自动尝试以模式运行它。

但是,我怀疑,我们需要将多处理部分完全留给 Python。我无法想象 PM2 能够管理由 Python 的多处理产生的多个进程——它在cluster模式下运行时会尝试这样做。此外,根据 PM2 文档,当使用该"interpreter"选项(例如用于 pipenv)时,仅会起作用。fork_mode

所以添加"exec_mode": "fork"到你pm2.config.json的让它运行​​。

如果你不使用pm2.config.json文件,传递-i 0pm2 start也应该强制 fork 模式。(-i 代表实例)

于 2019-05-02T11:19:10.647 回答
6

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

--

有几种解决方案。首先,您可以使用http://supervisord.org/,它是一个不错的通用过程控制系统,它包括许多开箱即用的功能,例如自动重启、重启计数器、日志记录、灵活配置等。

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

于 2015-08-20T20:56:13.443 回答
2

就我而言,我在我的项目中使用了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"

希望这个例子可以帮助

于 2016-11-10T13:06:01.127 回答
2

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

 nohup mycommand

   OR

 nohup python3 -m flask run &
于 2020-03-05T06:19:33.123 回答