
目录
pm2是什么
特点
示例说明
配置文件
常用命令
背景
由于需要在容器云新增一个测试环境,改了代码相关的配置后,进行部署。发现服务一直启动不了。在和运维一起排查问题,他看到pm2的一些信息, 问我pm2是不是阻塞了,并不是很清楚pm2是什么。就初步学习了一下,进行记录。
PM2是什么
Precess Manager 2
PM2是一个进程管理工具,维护一个进程列表,可以用来管理正在用行的进程,实时查看日志,性能监控等功能
特点
- 日志管理 (已使用)
- 支持监听重启
- 支持部署工作流
- 支持集群模式
- 支持性能监控
- 支持pm2 开发
示例说明
- 首先 npm init 新建一个node项目 
- 全局安装pm2 (npm install pm2 -g), 如果已经安装过,则不需要再次操作 
- 在这个项目里新建index.js, (创建一个http服务器) 
- 执行命令 - pm2 ecosystem, 默认会生成pm2的配置文件)( ecosystem.config.js)
- 在配置文件里进行关于应用的各种配置 -  
配置文件
- 执行命令 - pm2 ecosystem, 默认会生成 ecosystem.config.js (和package.json放在一个根目录下)
- 生成文件内容如下 - module.exports = {
 apps : [
 {
 script: 'index.js',
 watch: '.'
 },
 {
 script: './service-worker/',
 watch: ['./service-worker']
 }
 ],
 deploy : {
 production : {
 user : 'SSH_USERNAME',
 host : 'SSH_HOSTMACHINE',
 ref : 'origin/master',
 repo : 'GIT_REPOSITORY',
 path : 'DESTINATION_PATH',
 'pre-deploy-local': '',
 'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
 'pre-setup': ''
 }
 }
 };
- apps 是一个数组, 每一项数组成员对应一个pm2中的应用
对配置文件详解
| 配置名 | 含义 | 
|---|---|
| apps | json结构,是一个数组,里面每一项是一个pm2的应用 | 
| name | 应用程序名称 | 
| cwd | 应用程序所在目录 | 
| script | 应用程序启动文件所在目录 | 
| exec_mode | 应用启动模式,默认是fork, 可设置为 cluster集群 | 
| instances | 应用启动实例个数,仅在cluster模式有效 | 
| max_memory_restart | 最大内存限制数, 超出自动重启 | 
| log_date_format | 日志文件格式 | 
| error_file | 错误日志文件路径 | 
| out_file | 正常日志文件路径 | 
| merge_logs | 设置追加日志而不是新建日志 | 
| autorestart | 是否自动重启, true/false | 
| watch | 是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载 | 
| ignore_watch | 不用监听的文件,例如node_modules | 
| restart_delay | 延时重启时间 | 
| env | 生产环境变量 | 
| env_dev | 开发环境变量 | 
| env_test | 测试环境变量 | 
| min_uptime | 如果应用程序在这个时间退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量 | 
| max-restarts | 异常时重启次数 | 
示例app进行配置如下:
module.exports = {
  apps : [
    {
      name: 'xiaoyu_node_test',   //名称
      script: 'index.js',   //程序入口
      watch: '.',  // 需要监控的目录
      error_file: '/home/logs/err.log',  //错误日志文件
      out_file: '/home/logs/info.log',  // 正常日志文件
      log_date_format: 'YYYY-MM-DD HH:mm:ss',  // 指定日志文件的时间格式
      autorestart: true,   // 发生异常是否自动重启, true重启, false不重启
      env: {
        NODE_ENV: 'production',  //环境参数,当前指定为生产环境 process.env.NODE_ENV
        REMOTE_ADDR: ''   // process.env.REMOTE_ADDR
      },
      env_dev: {
        NODE_ENV: 'development',  //环境参数,当前指定为开发环境 pm2 start app.js --env_dev
        REMOTE_ADDR: ''   // process.env.REMOTE_ADDR
      }
    }, 
    {
      script: './service-worker/',
      watch: ['./service-worker']
    }
  ],
  deploy : {
    production : {
      user : 'SSH_USERNAME',
      host : 'SSH_HOSTMACHINE',
      ref  : 'origin/master',
      repo : 'GIT_REPOSITORY',
      path : 'DESTINATION_PATH',
      'pre-deploy-local': '',
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
      'pre-setup': ''
    }
  }
};
常用命令
- 安装pm2 - npm install pm2 -g // 要进行全局安装
- 启动进程(应用) 
- 1.直接启动对应的js文件 - pm2 start index.js-  
- 2.启动pm2的配置文件 - pm2 start ecosystem.config.js-  
重启
pm2 restart ecosystem.config.js
查看日志
pm2 logs

可以实时展示日志,而且会在自己配置文件中指定的路径生成日志文件
查看进程 以及 查看进程详情
pm2 list

具体的查看某一个进程详情,例如查看id=4的进程
pm2 describe 4     //id号

查看cpu和内存资源占用等一些性能指标
pm2 monit


*https://keymetrics.io/这个网址,经过一些设置,可以可视化看一些指标。由于打不开这个页面, 没有进行实际测试
停止进程
pm2 stop 0                // 0是id  id|name|namespace|all|json|stdin

status 已经变成 stoped
删除进程
pm2 delete 0.        //id号
上述的列表里就会删掉这一条
开机自启动
- pm2 start 配置文件
- pm2 save// 保存现有列表数据
- pm2 startup//设置开机启动
结尾
Pm2 能做的还有很多,等待挖掘...