如何运行一个python像nodejs的pm2这样的脚本

How to run a python script like pm2 for nodejs

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

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

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

--

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

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

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

pm2 start echo.py

如果脚本以 .py 后缀结尾,它将默认使用 python 解释器。如果你的文件名不以 .py 结尾,你可以这样做:

pm2 start echo --interpreter=python

我发现您在使用 python 时必须小心一点,尤其是当您使用与 'default' 不同版本的 virtualenv python 时python 在你的机器上。

PM2就够了,它会运行解释器后缀:

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

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

希望这个例子能帮到你

我创建了一个回声系统文件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

PM2 with pipenv

对于那些试图 运行 python 程序 from/with pipenv 尝试 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"。我是运行ning pm2 --version 3.0.0,老办法还行。

PM2 with Python multiprocessing

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

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

所以将 "exec_mode": "fork" 添加到您的 pm2.config.json 使其成为 运行。

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

你可以使用nohup- Nohup 是 no hang-up 的缩写,是 Linux 系统中的一个命令,即使在退出 shell 或终端后仍保持进程 运行。 Nohup 阻止进程或作业接收 SIGHUP(Signal Hang UP)信号。这是在关闭或退出终端时发送到进程的信号。 nohup 命令的一些基础知识如下。

 nohup mycommand

   OR

 nohup python3 -m flask run &