Skip to content
On this page

pm2

配置文件格式

PM2的配置文件可以用3种文件格式编写:

  1. JavaScript ecosystem.config.js 推荐使用
  2. JSON
  3. YAML

特别注意:JavaScript格式的配置文件的名称必须以.config.js作为结尾。例如:ecosystem.config.js

配置

name

变量类型:字符串 应用名称

script

变量类型:字符串 脚本路径

env

变量类型:对象 环境参数

watch

变量类型:布尔值或数组

  • 若为true,则PM2将在监听到文件夹或子文件夹中的文件发生变更时,自动重启应用
  • 若为数组,则PM2将在监听到数组中的文件夹或子文件夹中的文件发生变更时,自动重启应用

注意:

  1. 默认情况下,忽略node_modules。如果需要解除忽略,请使用ignore_watch反向解除

  2. 默认情况下,watch无法监听以.开头的文件或文件夹,但可以使用ignore_watch反向实现

示例:以下配置皆无法监听以 . 开头的文件或文件夹

learn_pm2/ecosystem.config.js

javascript
module.exports = {
  apps: [
    {
      name: "learn_pm2",
      script: "index.js",
      watch: true
    }
  ]
};

learn_pm2/ecosystem.config.js

javascript
module.exports = {
  apps: [
    {
      name: "learn_pm2",
      script: "index.js",
      watch: [".foo"]
    }
  ]
};

示例:监听所有文件或文件夹,包括以.开头的文件或文件夹

learn_pm2/ecosystem.config.js

javascript
module.exports = {
  apps: [
    {
      name: "learn_pm2",
      script: "index.js",
      watch: true,
      ignore_watch: []
    }
  ]
};

watch_delay

变量类型:数字 单位:毫秒 两次重启之间的时间间隔 使用禁止前沿执行的throttle策略

示例: watch_delay: 4e3表示:

  1. 当PM2监听到第1次文件变更时,将计划在4e3毫秒后重启应用

  2. 如果在这4e3毫秒内又监听到新的文件变更,之前的延时重启计划不受影响,且这次新的文件变更将不会生成新的延时重启计划

ignore_watch

变量类型:数组 不需要监听的列表

out_file

单个应用的日志文件名,记录使用console.log()输出的信息。

示例: learn_pm2/ecosystem.config.js

javascript
module.exports = {
  apps: [
    {
      name: "learn_pm2",
      script: "index.js",
      watch: ["index.js"],
      out_file: "out.log"
    }
  ]
};

error_file

单个应用的错误日志文件名,记录使用console.error()输出的信息。 默认值:$HOME/.pm2/logs/XXXerr.log

示例:

learn_pm2/ecosystem.config.js

javascript
module.exports = {
  apps: [
    {
      name: "learn_pm2",
      script: "index.js",
      watch: ["index.js"],
      error_file: "error.log"
    }
  ]
};

time

是否在out_fileerror_file中启用时间戳,默认为false

示例:

javascript
module.exports = {
  apps: [
    {
      name: "learn_pm2",
      script: "index.js",
      watch: ["index.js"],
      out_file: "out.log",
      error_file: "error.log",
      time: true
    }
  ]
};

多应用

一个配置文件可以同时配置多个应用。

示例:

learn_pm2/ecosystem.config.js

javascript
module.exports = {
  apps: [
    {
      name: "foo",
      script: "foo.js"
    },
    {
      name: "bar",
      script: "bar.js"
    }
  ]
};

bug

经过测试,以下情况会导致watch特性未开启(尽管显示已开启)。

示例:

learn_pm2/ecosystem.config.js

javascript
module.exports = {
  apps: [
    {
      name: "learn_pm2",
      script: "index.js",
      watch: true
    }
  ]
};
  1. 启动
bash
#!/usr/bin/env bash
npx pm2 start
  1. 停止
bash
#!/usr/bin/env bash
npx pm2 stop ecosystem.config.js
  1. 再次启动
bash
#!/usr/bin/env bash
npx pm2 start
  1. 查询PM2管理的应用列表
bash
#!/usr/bin/env bash
npx pm2 list

此时 watch 特性显示为启用,但实际却是关闭的。

这个问题目前有2种解决方案:

方案一: 在停止后先删除再启动

bash
#!/usr/bin/env bash
npx pm2 delete ecosystem.config.js
npx pm2 start

方案二: 在停止后使用--watch参数单独启动

bash
#!/usr/bin/env bash
npx pm2 start learn_pm2 --watch

常用指令

bash
pm2 start app.js               # 启动app.js应用程序

pm2 start app.js --name="demo"  # 启动应用程序并命名为 "demo"

pm2 start app.js --watch       # 当文件变化时自动重启应用

pm2 start script.sh            # 启动 bash 脚本

pm2 list                       # 列表 PM2 启动的所有的应用程序

pm2 show [app-name]            # 显示应用程序的所有信息

pm2 logs                       # 显示所有应用程序的日志

pm2 logs [app-name]            # 显示指定应用程序的日志

pm2 stop all                   # 停止所有的应用程序

pm2 stop 0                     # 停止 id为 0的指定应用程序

pm2 restart all                # 重启所有应用

pm2 restart 0                  # 重启id为0 的应用程序

pm2 delete all                 # 关闭并删除所有应用

pm2 delete 0                   # 删除指定应用 id 0

pm2 startup                    # 创建开机自启动命令

pm2 save                       # 保存当前应用列表

pm2 restart start.json --max-memory-restart 20M # 内存达到20m重启
javascript
// ecosystem.config.js
module.exports = {
  apps: [
    {
      name: "onebyone",
      watch: true,
      cwd: "./",
      script: "node",
      args: "./node_modules/.bin/nuxt start",
      max_memory_restart: "40M",
      log_date_format: "YYYY-MM-DD HH:mm Z",
      error_file: "/usr/local/wwwlogs/surmon.me/error.log",
      out_file: "/usr/local/wwwlogs/surmon.me/out.log",
      env: {
        "NODE_ENV": "production",
      }
    }
  ]
}