超级好用的进程管理器 pm2 使用教程
超级好用的进程管理器 pm2 使用教程
本文同步于我的个人网站
场景
最近在开发一个类似于分布式猫娘的客服机器人,然后嘛,一是考虑到 python 这种垃圾语言不太适合做软件开发,二是方便后续的负载均衡,我把客服 bot 系统设计成了如下三个部分:
- NTQQ 客户端的 server(ws)
- 根据 onebot v11 协议实现的逻辑路由层(ws,http)
- 用 python 搭建的 RAG 系统(http)
很显然上述三个每个都是一个需要挂在后台,长期运行的 server,如果每次运行都要 screen -r xxx 或者 tmux attach-session -t xxx 未免显得有点不优雅。于是,我在想有没有好用的进程管理器,然后我这日渐衰退的脑子瞬间想到了一个工具——pm2。
pm2 是一款基于 nodejs 开发的生产级别的进程管理器。所以阁下需要先在你的服务器上下载一个 nodejs。
基于 pm2,可以很好地完成进程的创建,后台挂载,管理,自动重启等等一系列功能。我只用了1个小时,但是可以说是非~常~好~用~。

[nodejs] pm2 : nodejs 的进程管理工具 - 千千寰宇 - 博客园 是非常棒的一篇有关 pm2 的文章。
安装
使用 npm 安装即可:
npm install pm2 -g
使用版本展示验证安装:
pm2 -v
输出:
5.4.0
基本使用
在后台启动进程
基本指令为:
pm2 start /path/to/可执行文件
比如我来启动QQ的拉格朗日后端:
pm2 start ./Lagrange.OneBot
输出:
[PM2] Starting /ubuntu/project/rag-llm/app/publish/Lagrange.OneBot in fork_mode (1 instance)
[PM2] Done.
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ Lagrange │ fork │ 0 │ online │ 0% │ 7.2mb │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
并且,通过 pm2 start 开启的进程,在挂掉后 pm2 会自动帮你重启。
对于常用的脚本语言,比如 JavaScript,Python,通过 pm2 start 直接就可以启动, pm2 会自动根据文件类型使用正确的脚本解释器:
pm2 start main.py
输出:
[PM2] Starting /ubuntu/project/rag-llm/main.py in fork_mode (1 instance)
[PM2] Done.
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ Lagrange │ fork │ 0 │ online │ 0% │ 128.4mb │
│ 1 │ main │ fork │ 0 │ online │ 0% │ 6.2mb │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
如果你是需要指定特定的解释器,比如你用的是某个 anaconda 的环境,那么可以通过 --interpreter 指定解释器
pm2 start main.py --interpreter=/path/to/python3
通过 --name 参数可以指定创建的进程的名字,否则,默认按照 pm2 start 后的执行文件去除后缀名后的字符串作为 name。比如:
pm2 start main.py --name 'llm-rag'
输出:
[PM2] Starting /ubuntu/project/rag-llm/main.py in fork_mode (1 instance)
[PM2] Done.
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ Lagrange │ fork │ 0 │ online │ 0% │ 123.9mb │
│ 2 │ llm-rag │ fork │ 0 │ online │ 0% │ 3.1mb │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
展示输出
通过 pm2 log <name/id> 的方式展示指定进程的标准输出信息:
pm2 log 0
输出:
/ubuntu/.pm2/logs/Lagrange-out.log last 15 lines:
0|Lagrange | [ReverseWSService] Client reconnecting at interval of 5000
0|Lagrange | info: Lagrange.OneBot.Core.Network.Service.ReverseWSService[4]
0|Lagrange | [ReverseWSService] Client reconnecting at interval of 5000
0|Lagrange | info: Lagrange.OneBot.Core.Network.Service.ReverseWSService[4]
0|Lagrange | [ReverseWSService] Client reconnecting at interval of 5000
...
日志文件都在 ~/.pm2/logs 文件夹下
通过 pm2 monit 可以展示所有进程的当前状态和输出信息,是超级好用~的一个功能。
pm2 monit
输出

查看日志 / 进程信息
通过 pm2 ls 查看所有的进程
pm2 ls
输出
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ Lagrange │ fork │ 0 │ online │ 0% │ 124.9mb │
│ 1 │ main │ fork │ 0 │ online │ 0% │ 8.4mb │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
显示进程的所有信息
pm2 show Lagrange
# pm2 info Lagrange
# pm2 describe Lagrange
输出
Describing process with id 0 - name Lagrange
┌───────────────────┬────────────────────────────────────────────────────────────────┐
│ status │ online │
│ name │ Lagrange │
│ namespace │ default │
│ version │ 1.0.0 │
│ restarts │ 0 │
│ uptime │ 2h │
│ script path │ /data/zhelonghuang/project/rag-llm/app/publish/Lagrange.OneBot │
│ script args │ N/A │
│ error log path │ /data/zhelonghuang/.pm2/logs/Lagrange-error.log │
│ out log path │ /data/zhelonghuang/.pm2/logs/Lagrange-out.log │
│ pid path │ /data/zhelonghuang/.pm2/pids/Lagrange-0.pid │
│ interpreter │ none │
│ interpreter args │ N/A │
│ script id │ 0 │
│ exec cwd │ /data/zhelonghuang/project/rag-llm/app/publish │
│ exec mode │ fork_mode │
│ node.js version │ N/A │
│ node env │ N/A │
│ watch & reload │ ✘ │
│ unstable restarts │ 0 │
│ created at │ 2024-05-28T10:39:12.286Z │
└───────────────────┴────────────────────────────────────────────────────────────────┘
Divergent env variables from local env
┌────────────────┬────────────────────────────────────────────────┐
│ PWD │ /data/zhelonghuang/project/rag-llm/app/publish │
│ SSH_CONNECTION │ 192.168.250.8 51740 172.16.120.6 22 │
│ XDG_SESSION_ID │ 9528 │
│ SSH_CLIENT │ 192.168.250.8 51740 22 │
│ OLDPWD │ /data/zhelonghuang/project/rag-llm/app │
└────────────────┴────────────────────────────────────────────────┘
Add your own code metrics: http://bit.ly/code-metrics
Use `pm2 logs Lagrange [--lines 1000]` to display logs
Use `pm2 env 0` to display environment variables
Use `pm2 monit` to monitor CPU and Memory usage Lagrange
结束进程 / 删除进程
使用 pm2 stop <name> 结束进程
pm2 stop main
输出:
[PM2] Applying action stopProcessId on app [main](ids: [ 1 ])
[PM2] [main](1) ✓
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ Lagrange │ fork │ 0 │ online │ 0% │ 125.1mb │
│ 1 │ main │ fork │ 0 │ stopped │ 0% │ 0b │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
或者使用 pm2 stop <id> 也行,对于进程 main,它的 id 是 1,所以使用方法为
pm2 stop 1
需要注意,结束进程并不会真正杀死进程,进程的运行上下文等信息还会留存在 pm2 的系统中,此时运行 pm2 ls 的结果为
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ Lagrange │ fork │ 0 │ online │ 0% │ 123.8mb │
│ 1 │ main │ fork │ 0 │ stopped │ 0% │ 0b │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
想要真正删除一个进程,需要使用 pm2 delete
pm2 delete main
此时再看进程列表
pm2 ls
可以看到,只剩 0 号进程了
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ Lagrange │ fork │ 0 │ online │ 0% │ 123.9mb │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
除此之外,pm2 还可以通过 Ecosystem 文件来快速创建,此处就不再赘述了。

浙公网安备 33010602011771号