使用 pm2 管理 python 应用程序

Manage a python application using pm2

我有一个具有以下结构的 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 命令,然后应用程序启动 运行ning,因为它应该 ¯_(ツ)_/¯。 运行 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 的配置文件?

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

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

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

"ignore_watch": ["log"],

而不是禁用监视模式。

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