一、pm2命令介绍

pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能

pm2是基于npm进行安装的,在安装pm2之前要先安装npm
安装命令
sudo npm install -y pm2 -g

查看安装的pm2的版本
pm2 -v

更新PM2
更新PM2非常快(少于几秒)并且无缝。
首先确保您正确保存了所有进程:
pm2 save
然后从NPM安装最新的PM2版本:
npm install pm2 -g
最后更新内存中的PM2进程:
pm2 update

二、pm2 的特性

pm2是node进程管理工具。
1、后台运行
普通启动方式:node index.js,关闭终端就结束进程;
pm2可以后台运行,终端关闭不影响。

2、自动重启
可以监听某些文件改动,自动重启

3、停止不稳定的进程
限制不稳定的重启的次数,达到上限就停止进程。

4、0 秒停机重启
集群模式下,可以达到重启时不停止服务。

5、简单日志管理
pm2可以收集日志,并有插件配合进行管理。

三、基础用法

1、启动进程:
pm2 start app.js

app.js是node的启动文件,控制台会有如下打印。
image.png
(1)其中app name 和id都是这个进程的标识,可以对他们进行别的操作,比如stop,delete等。
(2)mode:进程模式,cluster或fork。cluster有多个进程,而fork只有一个。
(3)status:进程是否在线
(4)restart:重启次数
(5)uptime:运行时间
(6)cpu:cpu占用率
(7)mem:内存占用大小

2、停止进程:
pm2 stop app_name|app_id|all

3、删除进程:
pm2 delete app_name|app_id|all

注:有时候遇到vue项目重启或start都不好使,但是程序没有代码错误的情况下,杀掉进程,重启即可。
此进程使用kill 无效,因为存在守护进程,所以手动kill掉某个进程后会自动重启
4、重启进程
pm2 restart/reload app_name|app_id|all
集群模式下,restart中断服务,而reload不会

5、查看所有的进程:pm2 list/ls/status
image.png
id编号从1~4的是一个应用,分别对应4个进程。

6、查看某一个进程的信息:pm2 show app_name|app_id
image.png
第一张图是指进程的信息,比如status(状态)、restarts(重启次数)、uptime(运行时间)、script path(启动入口的路径)、script args(启动文件的参数)、error log path(错误日志的路径)、out log path(输出日志的路径)、exec mode(进程的模式)、watch&reload(是否开启监听文件变动重启)、unstable restarts(不稳定的重启次数)

image.png
第二张图是指代码指标:heap size(堆内存)、heap usage(堆内存使用率)、used heap size(堆内存使用情况)、event loop latency(事件循环时延)、event loop latency p95(事件循环时延 第95分位)

7、查看日志:pm2 logs
会打印下面的信息。但是一般不这么看,一般直接进入红框的路径,直接用less 命令查看日志文件。

pm2 logs —lines 200
image.png
pm2 logs —raw # 显示流中的所有进程日志
image.png
pm2 flush # 清空所有日志文件
pm2 reloadLogs # 重新加载所有日志p

8、监控所有进程:pm2 monit
image.png
左上角是进程的列举,右上角是全部的实时日志,左下角是选中进程的代码指标,右下角是进程的信息。

9、启动命令(start)还可以带参数

  1. --name 给进程命名
  2. --watch 是否开启自动重启
  3. --max-memory-restart 最大重启内存
  4. --log 指定日志文件路径
  5. --no-autorestart 不要自动重启应用程序
  6. -- arg1 arg2 arg3
  7. 其他参数

四、集成部署(Ecosystem File)

若使用cluster模式,必须是启动文件入口,不可通过npm启动

1、why

(1)不同环境(dev、test、master)
(2)通过命令行传递参数不方便
(3) 同时管理多个应用

2、how

生成一个配置文件:pm2 ecosystem
app是要管理应用的数组,每个对象都是一个应用的配置。

3、配置项

name:进程名
script:node启动文件的路径
cwd :项目所在的目录
args :通过命令行传递给node启动文件的参数
interpreter :编译器的绝对路径(默认node)
interpreter_args :传给编译器的参数
node_args:传给node的参数

ecosystem.json

  1. {
  2. "apps" : [
  3. {
  4. "name": "cfg-server",
  5. "script": "app.js",
  6. "env": {
  7. "COMMON_VARIABLE": "true"
  8. },
  9. "env_production" : {
  10. "NODE_ENV": "production"
  11. }
  12. }
  13. ],
  14. "deploy" : {
  15. "production" : {
  16. "user" : "root",
  17. "host" : "47.18.138.2 -p 13800",
  18. "ref" : "origin/master",
  19. "repo" : "git@gitlab.xxx.com:Front-end/xxx-node.git",
  20. "path" : "/root/fesrc/cfg-node",
  21. "post-deploy" : "git reset --hard && git pull && pm2 start ecosystem.json --env production"
  22. }
  23. }
  24. }