pm2简介

什么是PM2,P(rocess)M(anager)2 Runtime,运行时的进程管理器。

为什么要用PM2,作为进程管理者,它提供了大量的便利操作帮助开发者管理他们的应用。

运行如下的命令

1
pm2 start app.js

启动一个进程就是如此的简单,一旦启动,它将会永久运行,在机器崩溃或者重启的时候,自动重启。

安装pm2

用npm

1
npm install pm2 -g

用yarn

1
yarn global add pm2

CLI 自动提醒

安装completion

1
pm2 completion install

然后当你输入命令的时候,可以提醒你哪些命令可用。比如输入pm2 re,再按tab键,输出如下内容,提示你re开头的命令有哪些。

1
2
➜  ~ pm2 re
register reload reloadLogs report reset restart resurrect

如果不知道某个命令有哪些参数,哪些功能,可以使用–help标志。

1
2
# 查看pm2 restart怎么用
pm2 restart -h

管理多个进程(Manage multiple processes)

PM2会保留您的进程列表,以便能够轻松启动,重启和停止它们。

1
2
3
4
5
6
7
8
9
# start and add a process to your list
# can use --name or -n to define process name
pm2 start app.js

# show your list
pm2 ls

# stop and delete a process from the list
pm2 delete app

当应用启动后,可以使用应用名来管理你的应用。

1
2
3
4
5
6
7
8
# stop the process (kill the process but keep it in the process list)
pm2 stop app

# start the process
pm2 start app

# both stop and start
pm2 restart app

同样,当服务器重启时,可以使用startup脚本来启动。

查看日志(Access your logs)

使用pm2 logs来查看所有进程的实时日志,也可以通过进程名(进程ID)来查看指定进程的日志,比如pm2 logs app。

在~/.pm2/logs文件夹下,有进程的所有日志(常规输出/错误输出)

Clusterize

cluster模式可以充分利用服务器CPU,不需要任何代码的改动。

1
2
3
4
5
6
7
8
# 使用 -i 参数可以启动cluster模式
pm2 start app.js -i 4

# 自动检测可用的CPU数
pm2 start app.js -i max

# 使用reload命令来代替restart命令,实现0秒停机
pm2 reload app

Ecosystem File

使用Ecosystem File来代替在多个服务器上部署或使用多个命令行参数启动进程,方便轻松管理应用。

生成模版文件

在pm2 3.0以上的版本中,有pm2 init命令,在3.0以下,有pm2 ecosystem命令,都会生成一个ecosystem.config.js文件,内容大致如下:

命令:

1
pm2 init # pm2 ecosystem

生成的文件 ecosystem.config.js

1
2
3
4
5
6
7
8
9
10
11
12
module.exports = {
apps : [{
name: "app", // 进程名
script: "./app.js", // 启动文件
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}]
}

用法

常规用法

在项目根目录下,可以使用pm2 start命令启动所有进程,默认查找ecosystem.config.js文件,启动所有定义在apps下的进程。

如果文件重命名了,假设为file.api.js,那么启动命令改为pm2 start file.api.js,效果和ecosystem一样。

启动特定的app

假设file.api.js下有app和file的服务可以启动,但是只启动file服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module.exports = {
apps : [{
name: "app", // 进程名
script: "./app.js", // 启动文件
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}, {
name: "file",
script: "./file.js",
env: {
NODE_ENV: "development"
},
env_production: {
NODE_ENV: "production",
}
}]
}

那么启动命令使用–only <app_name>,如下:

1
pm2 start file.api.js --only app

环境变量

pm2支持在不同环境下不同的参数,格式: env_,在上面的例子中有两种环境:development和production,假设要加上staging环境,那么加上env_staging,然后定义环境变量即可。

使用–env标志来启动不同的环境:

1
2
pm2 start file.api.js // 默认development,使用env下的变量
pm2 start file.api.js --env production // 使用env_production下的变量

不可变环境

应用的环境在应用进程创建的时候就定下来,即使重启也不会改变应用的环境,这种行为保证了环境的一致性。

如果要强制更新应用的环境,一定要使用–update-env:

1
2
3
4
5
# refresh the environment
pm2 restart ecosystem.config.js --update-env

# switch the environment
pm2 restart ecosystem.config.js --env production --update-env