npm i -g pm2
我的服务器中 nodejs 安装目录为 /software/nodejs
安装过程中的代码:
[root@VM_0_8_centos ~]# npm i -g pm2
/software/nodejs/bin/pm2 -> /software/nodejs/lib/node_modules/pm2/bin/pm2
/software/nodejs/bin/pm2-dev -> /software/nodejs/lib/node_modules/pm2/bin/pm2-dev
/software/nodejs/bin/pm2-docker -> /software/nodejs/lib/node_modules/pm2/bin/pm2-docker
/software/nodejs/bin/pm2-runtime -> /software/nodejs/lib/node_modules/pm2/bin/pm2-runtime
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.1.2 (node_modules/pm2/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
+ [email protected]
added 185 packages from 191 contributors in 71.334s
请特别留意第一行提示代码
/software/nodejs/bin/pm2 -> /software/nodejs/lib/node_modules/pm2/bin/pm2
/software/nodejs/bin/pm2
表示 pm2 的快捷图标位置、/software/nodejs/lib/node_modules/pm2/bin/pm2
表示 pm2 的实际文件位置
默认windows系统下安装之后自动将 pm2 添加到全局环境路径中,但是在 Centos 中需要额外手工创建全局软连接。
ln -s /software/nodejs/bin/pm2 /usr/local/bin/pm2
或
ln -s /software/nodejs/lib/node_modules/pm2/bin/pm2 /usr/local/bin/pm2
你需要将
/software/nodejs
修改成你服务器上对应 nodejs 的安装目录
命令 | 说明 |
---|---|
pm2 update | 将pm2升级到最新版本 |
命令 | 说明 |
---|---|
pm2 start app.js | 启动运行 app.js ,默认使用 fork 形式,且只启动 1 个线程 (例如启动nodejs项目 pm2 start /mykoa/mymood/app.js) |
参数 | 说明 |
---|---|
--name xxx | 设置进程名字为 xxx |
--watch | 对文件进行监控,若发现修改则立即重启服务 |
--watch --ignore-watch="node_modules" | 对文件进行监控,但是忽略 node_modules 目录中文件的改变 |
--max-memory-restart 200MB | 若程序内存占用超过 200MB 则重启该程序 (系统每隔30秒检查一次,因此若中间达到 200MB 时可能需要等一段时间后才会重启) |
--log xxxx | 存放日志的路径 |
--error xxxx | 存放错误日志的路径 |
-- arg1 arg2 arg3 | 添加其他参数 |
--restart-delay 2000 | 延迟重启的毫秒数,效果等同于--exp-backoff-restart-delay=2000 |
--exp-backoff-restart-delay=100 | 延迟重启的毫秒数 (确保不会马上立即重启,给系统一些缓冲时间) |
--time | 写日志时加上日期 |
--cron <cron_pattern> | 强制重启时指定 cron (cron 是一种时间表达语法规则,例如 0 0 23 * * ? 表示每天 23点 执行一次) |
--kill-timeout 3000 | 超时延长至 3000 毫秒 |
--wait-ready | 等待要启动的程序向系统进程发送 ready 信号 (例如 nodejs 创建http服务完成后,执行 process.send('ready')) |
--listen-timeout 3000 | 设置 wait-ready 监听超时时间为 3000毫秒 |
--shutdown-with-message | 是否允许pm2向系统进程发送关闭信号 (Nodejs可以通过 process.on('message',function (msg) { if(msg==='shutdown') }) 来做出响应处理 |
--no-autorestart | 不自动重启服务 |
--no-vizion | 不使用视图模式 |
--no-daemon | 附加到应用程序日志 (daemon 为守护进程) |
命令 | 说明 |
---|---|
pm2 ping | 若系统回复:{ msg: 'pong' } 则表示已启动 |
命令 | 说明 |
---|---|
pm2 reset | 重新设置 (暂时不明白具体用法) |
pm2 updatePM2 | 更新 (暂时不明白具体用法,难道下次重启pm2时更新pm2版本?) |
pm2 sendSignal SIGUSR2 my-app | 发送一个系统信号到某进程 (暂时不明白具体用法) |
命令 | 说明 |
---|---|
pm2 start app.js -i 0 | 以本机最大CPU核数为基准数,同时启动多个线程 (例如本机为4核CPU,则启动4个线程) |
pm2 scale app +3 | 新增 3 个 app服务的 线程 (前提是系统还有足够空闲CPU核数) |
pm2 scale app 2 | 控制 app服务的 线程数 只能为 2个 (在现有线程数的基础上增加或减少,最终只保证有2个线程) |
命令 | 说明 |
---|---|
pm2 restart app_name | 重启 app_name (注意:app_name是进程名,而不是进程对应的文件app.js) |
pm2 reload app_name | 重新加载 app_name |
pm2 stop app_name | 暂停 app_name |
pm2 delect app_name | 删除 app_name |
app_name 改为 all | 则表示 对所有进程的操作 |
app_name 改为 0 | 则表示 对 pm2 list 中 id为 0 的进程的操作 |
命令 | 说明 |
---|---|
pm2 list、pm2 ls、pm2 status | 用表格形式列出当前所有 pm2 启动运行的进程 (仅列出简要信息) |
pm2 jlist | 用JSON形式列出当前所有 pm2 启动运行的进程详情 (JSON字符串粘连在一起,基本无法阅读) |
pm2 prettylist | 用美化、格式化后的JSON形式列出当前所有 pm2 启动运行的进程详情 (JSON字符可读性强) |
命令 | 说明 |
---|---|
pm2 describe 0 | 显示某个 id 进程的所有信息 (默认pm2 启动的第一个程序 id 为 0,id 数字值往后依次递增) |
pm2 monit | 以表格形式,显示多个进程的所有信息 显示出来的4个表格,分别为: 进程列表(左上)、进程日志(右上)、运行指标(左下)、元数据(右下) 界面操作方式:左右键切换表格、上下键滚动表格、ctrl + c 退出界面 |
命令 | 说明 |
---|---|
pm2 logs | 显示全部日志 |
pm2 logs xxx | 仅仅显示 进程名为xxx 的日志 (例如 pm2 logs myapp) |
pm2 logs --format | 格式化显示日志 |
pm2 logs --lines 200 | 只显示最近 200 行日志 |
pm2 reloadLogs | 重新加载,显示全部日志 |
pm2 flush | 清空全部日志 |
执行命令:
pm2 ecosystem
上述代码执行后,会显示以下文字:
File /usr/local/bin/ecosystem.config.js generated
用代码编辑工具,编辑 /usr/local/bin/ecosystem.config.js
该文件,添加或修改配置文件中的属性值。
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为一个数组,里面可以存放多条配置信息 deploy(配置)选项,用来配置 git 相关的属性值
pm2 [start|restart|stop|delete] ecosystem.config.js
只能在配置文件中才可以设置 开发(development) 或 测试(production) 环境变量。 例如,在 ecosystem.config.js 中设置:
module.exports = {
apps : [
{
name: "myapp",
script: "./app.js",
watch: true,
env: {
"PORT": 3000,
"NODE_ENV": "development"
},
env_production: {
"PORT": 80,
"NODE_ENV": "production",
}
}
]
}
以配置文件形式启动 pm2,同时添加 --env xxx 来明确以哪种环境启动:
pm2 start ecosystem.config.js --env production
例如获取环境变量中 POST 的值:
process.env.PORT
pm2 启动时参数代码:
pm2 start app.js --wait-ready
当然也可以设置 监听 wait-ready 超时时间:
pm2 start app.js --wait-ready --listen-timeout 3000
Nodejs 创建http服务完成后,通过 process 向系统发送 ready 信号:
var http = require('http');
var app = http.createServer(function(req, res) {
res.writeHead(200);
res.end('hey');
})
var listener = app.listen(0, function() {
console.log('Listening on port ' + listener.address().port);
// Here we send the ready signal to PM2
process.send('ready');
});
pm2 启动时添加参数,允许 pm2 向系统进程发送关闭信号:
pm2 start app.js --shutdown-with-message
Nodejs 监听 系统进度 中的信号:
process.on('message', function(msg) {
if (msg == 'shutdown') {
console.log('Closing all connections...');
setTimeout(function() {
console.log('Finished closing connections');
process.exit(0);
}, 1500);
}
});
pm2 save
执行后会得到以下信息:
[PM2] Saving current process list...
[PM2] Successfully saved in /root/.pm2/dump.pm2
pm2 startup
执行后会得到以下信息:
[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target
...
Target path
/etc/systemd/system/pm2-root.service
Command list
[ 'systemctl enable pm2-root' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-root...
Created symlink from /etc/systemd/system/multi-user.target.wants/pm2-root.service to /etc/systemd/system/pm2-root.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save
[PM2] Remove init script via:
$ pm2 unstartup systemd
pm2 unstartup
执行后会得到以下信息:
[root@VM_0_8_centos ~]# pm2 unstartup
[PM2] Init System found: systemd
Removed symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service.
[PM2] Init file disabled.
访问 https://pm2.io/ , 创建一个账户
注册时选择"personal use (个人版)",不要选择 ”professional use (专业版)“
个人版可免费创建4个项目的统计表。 例如本次演示,创建一个名为 mymood 的统计表。
每个 bucket(统计表) 对应专属的 link
pm2 link xvey2h2d24wghi2 wp1gdptcfrtqpfp
在服务器中执行:
pm2 plus
若首次使用,则需要登录 pm2.io 账户验证,验证成功后则会列出该账户下的统计表项目。
[root@VM_0_8_centos bin]# pm2 plus
[PM2 I/O] Using non-browser authentication.
[PM2 I/O] Do you have a pm2.io account? (y/n) y
[PM2 I/O] Your username or email: puxiao
[PM2 I/O] Your password: ********
[PM2 I/O] Authenticating ...
[PM2 I/O] Successfully authenticated
[PM2 I/O] Successfully validated
┌─────────────┬───────────┐
│ Bucket name │ Plan type │
├─────────────┼───────────┤
│ mymood │ free_v4 │
└─────────────┴───────────┘
[PM2 I/O] If you don't want to connect to a bucket, type 'none'
[PM2 I/O] Type the name of the bucket you want to connect to :
在第4步验证成功后,输入需要连接的统计表名字:mymood,即可连接该统计表。 此时在 https://app.pm2.io/ 项目后台,即可实时看到 服务器上的数据统计分析表。
若要断开 pm2.io 统计分析服务,则执行:
pm2 logout