【问题标题】:Manage a python application using pm2使用 pm2 管理 python 应用程序
【发布时间】:2021-04-20 19:51:26
【问题描述】:

我有一个具有以下结构的 Python 3 应用程序:

application
  |
  - application.json
  |
  - package
  |  |
  |  - __init__.py
  |  - module1.py
  |  - module2.py
  |
  - test_package
  |  |
  |  - __init__.py
  |  - test_module1.py
  |  - test_module2.py
  |
  - conf
  |  |
  |  - package.conf
  |
  - log
  | |
  | - module1.log
  | - module2.log
  |
  - virtualenv    (Python 3 virtual environment)
    |
    - bin
    | |
    | - python
    | - activate
    | - ...
    |
    - ...

它需要从application目录启动如下(假设你的工作目录是/path/to/application/):

/path/to/application/virtualenv/bin/python -m package.module1

virtualenv/bin/python -m package.module1

这个应用程序在服务器上运行一个后端服务,我想用 PM2 来管理它,因为我已经用它来管理服务器中一个基于 Node.js 的网站。

我尝试使用以下环境文件 (application.json) 没有成功,我无法弄清楚它有什么问题:

{
    "name": "application",
    "script": "/path/to/application/virtualenv/bin/python",
    "args": "-u -m package.module1",
    "cwd": "/path/to/application/",
    "instances": 1,
    "autorestart": true,
    "watch": true,
    "max_memory_restart": "1G",
    "pid": "/path/to/application/log/application.pid",
    "out_file": "/path/to/application/log/application_out_file.log",
    "error_file": "/path/to/application/log/application_error_file.log"
}

当我运行pm2 start application.json 时,应用程序启动,在其内部循环的一次迭代后崩溃,然后在完成内部循环的一次迭代之前它开始重新启动并一遍又一遍地崩溃。然后,我运行pm2 stop application 命令,应用程序开始运行,它应该是¯_(ツ)_/¯。再次运行pm2 stop application 命令确实会停止应用程序,delete 也可以工作。

我还尝试使用 PM2 文档中所述的 interpreterinterpreter-args,但我已经在脚本中调用了解释器,所以这不起作用。

我应该如何调用我的脚本,以免出现这种奇怪的行为?调用需要使用python -m package.module 调用的python 脚本的推荐方法是什么?

编辑

使用application 目录中的以下命令似乎有效:

pm2 start '/path/to/application/virtualenv/bin/python -u -m package.module1'

如何将其转换为 PM2 的配置文件?

【问题讨论】:

    标签: python python-3.x pm2


    【解决方案1】:

    我发现了问题所在。环境文件 (application.json) 的 watch 字段设置为 true。此设置监视应用程序的文件夹或子文件夹(例如,application 文件夹和子文件夹)中是否有任何文件更改。 Here is the documentation on that feature.

    日志包含在文件夹application/log/ 中,该文件夹是application 的子文件夹。一旦将任何内容写入日志,PM2 就会检测到这一点,并重新加载应用程序。禁用此设置可解决所有问题。

    【讨论】:

      【解决方案2】:

      我只想添加考虑设置选项--ignore-watch。例如,您可以添加到 application.json

      "ignore_watch": ["log"],

      而不是禁用手表模式。

      欲了解更多信息:https://pm2.keymetrics.io/docs/usage/watch-and-restart/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 2019-10-27
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 2016-10-11
        相关资源
        最近更新 更多