pm2常用命令大全

原文地址: https://www.cnblogs.com/yalong/p/13931999.html

背景:

  如果一个网站的服务,必须通过命令行 node server.js 来启动,启动后,退出命令行服务就终止,这显然不符合我们的预期。而即便是服务能持续运行,一旦遇到异常情况服务即终止,也是不理想的,这时候就需要有一种能够守护进程的工具或者服务,来把已经挂起的服务再次重启,这就是服务常驻的基本需求了。

对于 Node.js 来说,有很多工具可以帮我们做到这一点,PM2 就是其中一个。

PM2简介:

PM2是一个守护进程管理器,它将帮助您管理和保持应用程序在线。

PM2官网地址: https://pm2.keymetrics.io/docs/usage/quick-start/

PM2的优点:

  1. 支持进程行为配置 ,即可以通过配置,实现对pm2管理应用的一些基础属性更新修改,如应用名称,启动模式等;

  2. 支持集群模式,支持负载均衡,但因采用nodejs的cluster模块实现,仅适用于nodejs进程;

  3. 支持source map,此项针对js, source map文件是js源文件的信息文件,里面存储着源文件的位置信息;

  4. 支持热重启;

  5. 支持部署工作流,pm2可依据测试环境和线上环境自动部署到不同的服务器,同时运行在不同配置下;

  6. 支持监听重启,在文件更新等情况下可实现进程自动重启;

  7. 日志管理,两种日志,pm2系统日志与管理的进程日志,默认会把进程的控制台输出记录到日志中;

  8. 监控功能,pm2 monit监控cpu和memory使用情况,keymetrics监控更为详细;

  9. 支持pm2模块开发,实现pm2的功能扩展, 比如美团团队开发的pm2.5

  10. 最大内存重启,设置最大内存限制,超过限制自动重启;

PM2常用命令:

  1. pm2 start <script_file|config_file> [options] 启动指定应用,如pm2 start index.js --name httpServer;

  2. pm2 stop <appName> [options] 停止指定应用,如pm2 stop httpServer;

  3. pm2 list  把所有pm2启动实例列举出来,注意:pm2 stop 某个项目后,该项目还会存在pm2 list 的列表里面, 只是状态是 stop, 要想去掉该项目,用pm2 delete
  4. pm2 reload|restart <appName> [options]  重启指定应用,如pm2 restart httpServer;

  5. pm2 show <appName> [options] 显示指定应用详情,如pm2 show httpServer;

  6. pm2 delete <appName> [options] 删除指定应用,如pm2 delete httpServer,如果修改应用配置行为,最好先删除应用后,重新启动方才生效,如修改脚本入口文件;

  7. pm2 kill 杀掉pm2管理的所有进程;

  8. pm2 logs <appName>  查看指定应用的日志,即标准输出和标准错误;

  9. pm2 monit 监控各个应用进程cpu和memory使用情况;

  10. pm2 startOrReload <appName> 如果项目没有启动就执行 start  如果项目正在运行 就执行relaod

提示 除了使用 appName 之外, 还可以使用 all: 全部程序     id: 该程序的 id

PM2配置方式:

1.CLI方式(命令行方式)

下面是使用命令行方式启动的示例

pm2 start pm2.json --name appName 
--watch true--max-memory-restart 500M 

启动可以附加的参数包括不限于下面这些:

--script   启动脚本路径 
--instances应用启动实例个数,仅在cluster模式有效,默认为fork;
--exec_mode应用启动模式,支持fork和cluster模式;
--name     指定 app 名字
--watch    监听重启,启用情况下,文件夹或子文件夹下变化应用自动重启
--ignore_watch  忽略监听的文件夹,支持正则表达式,配合 watch 使用
--max-memory-restart  最大内存限制数,超出自动重启;
--env      环境变量,object类型,如{"NODE_ENV":"production", "ID": "42"};
--log      指定 log 的位置, 若要指定新位置,需将原本的 process 刪掉,再重新启动即可
--output   指定 output log 位址
--error    指定 error log 位址
--log-date-format     指定日志日期格式,如YYYY-MM-DD HH:mm:ss;
--arg1 --arg2 --arg3  额外的参数
--restart-delay   自动重启时,要 delay 多久
--autorestart     默认为true, 发生异常的情况下自动重启
--cron_restart    crontab时间格式重启应用,目前只支持cluster模式;
--restart_delay   异常重启情况下,延时重启时间;

2.配置文件方式

可以是 json文件 比如名字叫做 pm2.json 如下 (注意 json里面是不能有注释的,我下面是为了方便解释说明):

{
  "apps": [{
    "name": "shark-pro",
    "script": "server/www.js",
    "cwd": "",
    "exec_mode": "cluster",
    "instances": 0,
    "max_memory_restart": "1G",
    "autorestart": true,
    "node_args": [],
    "args": [],
    "env": {
      "NODE_ENV": "production"
    }
  }],
  "deploy": {
    "production": {
      "user": "root",
      // 支持多个 host 部署
      "host": ["host1", "host2"],
      // 要部署的分支
      "ref": "origin/master",
      // Git 仓库地址
      "repo": "git@gitlab.com:user/yourProject.git",
      // 要部署到 server 上的文件路径
      "path": "/var/www/yourProjectName",
      // 如果 ssh 有设定好,从 local 连接到 remote 端将不会再询问是否将 remote 端的 public key 加到 known host
      "ssh_options": "StrictHostKeyChecking=no",
      // 在 pm2 要从 local 端连到 remote 端之前要执行的指令,可以多個指令,由 ; 分割,也可以指定 shell script 的路径
      "pre-setup": "apt update -y; apt install git -y",
      // 当 pm2 在 remote 机器上把代码 clone 下來之后会执行的指令,同上,可以多個指令,由 ; 分割,也可以指定 shell script 的路径
      "post-setup": "ls -la",
      // 当 pm2 在 local 要连上 remote 部署之前 ,在 local 端所要执行的指令, 同上,可以多個指令,由 ; 分割,也可以指定 shell script 路径
      "pre-deploy-local" : "echo 'This is a local executed command'",
      // 部署完成后, 所要執行的指令 同上,可以多個指令,由 ; 分割,也可以指定 shell script 的路径
      "post-deploy": "npm i && pm2 startOrRestart pm2.json --env production",
      "env_production": {
          "NODE_ENV": "production"
      }
    }
  }
}

也可以是 .yaml文件  比如名字叫 ecosystem.yaml 文件, 如下:

apps:
  - script: server/www.js
    name:  myApp
    env:
      COMMON_VARIABLE: true
    env_production:
      NODE_ENV: production
deploy:
  production:
    user: root
    host:
      - 12.12.12.12
    port: '12'
    ref: origin/master
    repo: git@github.com:xxxxxxx.git
    path: /root/www/deploy/production
    ssh_options: StrictHostKeyChecking=no
    pre-deploy: git fetch --all
    post-deploy: 'npm i && pm2 startOrRestart ecosystem.yaml --env production'
    env:
      NODE_ENV: production

常见问题:

如下是执行  pm2 list  把运行的项目罗列出来

 

 status就是pm2 的启动模式, pm2 有两种启动模式 fork  cluster

1. fork 与 cluster 启动模式

fork模式,单实例多进程,常用于多语言混编,比如php、python等,不支持端口复用,需要自己做应用的端口分配和负载均衡的子进程业务代码。
缺点就是单服务器实例容易由于异常会导致服务器实例崩溃。

cluster模式,多实例多进程,但是只支持node,端口可以复用,不需要额外的端口配置,0代码实现负载均衡。
优点就是由于多实例机制,可以保证服务器的容错性,就算出现异常也不会使多个服务器实例同时崩溃。

2. reload 与 restart 区别

restart 是杀死并重新启动进程。

reload 与 restart相反,reload实现0秒的停机重新加载

也就说说 使用reload,pm2逐个重新启动所有进程,始终保持至少一个进程运行。
如果 reload 重新加载系统没有成功地重新加载应用程序,则超时将回退到经典的重新启动即 restart。

3. pm2 日志处理

pm2 本身是有支持日志存储的,就是 error_file 跟 out_file,  还有其他高级配置,都写在下面了, 代码如下:

{
  "apps": [{
      "name"        : "you-app-name",
      "script"      : "production.js",
      "watch"       : false, // 是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。
      "ignore_watch" : ["node_modules", "build"], // 忽略监听的文件夹,支持正则表达式
      "merge_logs"  : true, // 设置追加日志而不是新建日志
      "log_date_format" : "YYYY-MM-DD HH:mm Z", // 日期格式
      "exec_mode"   : "cluster",
      "error_file"  : "/home/logs/app.err.log", // 自定义应用程序的错误日志文件,代码错误可在此文件查找;
      "out_file"  : "/home//logs/app.out.log", // 自定义应用程序日志文件,如应用打印大量的标准输出,会导致pm2日志过大, 记得清理
      "max_memory_restart": "2G", // 最大内存限制数,超出自动重启;
      "env": { // 环境变量,object类型;
          "NODE_ENV": "production"
      }
  }]
}

pm2 更多配置说明可以看这些:

https://www.cnblogs.com/huiguo/p/12694542.html

https://pm2.keymetrics.io/docs/usage/quick-start

 

posted @ 2020-11-06 10:47  进军的蜗牛  阅读(12303)  评论(0编辑  收藏  举报