超级好用的进程管理器 pm2 使用教程

超级好用的进程管理器 pm2 使用教程

超级好用的进程管理器 pm2 使用教程

收录于 · K的Web全栈
8 人赞同了该文章
展开目录
 

本文同步于我的个人网站

场景

最近在开发一个类似于分布式猫娘的客服机器人,然后嘛,一是考虑到 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 文件来快速创建,此处就不再赘述了。

发布于 2024-05-28 22:20・安徽

posted on 2026-03-11 14:43  漫思  阅读(14)  评论(0)    收藏  举报

导航