pm2是node的进程管理器,它的最大好处是能管理多个node服务,系统重启后或文件修改后,都能重启node服务。
先全局安装pm2插件。
npm install -g pm2 //cnpm install -g pm2
生成配置文件,您可以键入以下命令:
pm2 init //会生成ecosystem.config.js文件,可更改名称为server.config.js
pm2 start server.config.js //启动配置文件
//配置监听文件与忽略监听文件如下:
//pm2 start ./src/index.js --watch --ignore-watch='test node_modules' --name echarts-export-server
注意:请确保它以.config.js
结尾,以便 PM2
能够将其识别为配置文件。
pm2默认解析器是nodex.exe,所以要想运行某个项目的npm命令,只能用node模块child_process或安装 node-cmd依赖。然后通过执行js,从而达到运行npm命令,操作如下:
//ps: Created by npm, please don't edit manually.
//方法一:使用Node模块child_process
//在项目根路径下添加cpm.js文件,其内容如下:
//require('child_process').exec('npm start', {windowsHide: true});
var exec = require('child_process').exec;
exec('npm start', {windowsHide: true});
//窗口命令
pm2 start cpm.js
====================================================================================
//方法二:使用第三方依赖node-cmd
//窗口命令
npm install node-cmd --save //在项目下,安装node-cmd
//在项目根路径下添加cpm.js文件,其内容如下:
//require('node-cmd').run('npm start');
var cmd=require('node-cmd');
cmd.run('npm start');
//窗口命令
pm2 start cpm.js
如果某个服务status(状态)stopped(停用),可用pm2 log 0(数字零是id)查看报错内容。
server.config.js
文件,运行命令【pm2 start server.config.js】启动配置文件:
module.exports = {
apps: [{
"name": "server1",//启动服务的名称
"script": "./npm.js",//默认是启动.js文件 前端启动
"cwd": "F:/bona/企业能源监测前端_管理系统_Energy-Monitor-UI", //绝对路径: windows文件目录
"max_memory_restart": "3G", // 最大内存重启
"autorestart": true, // 自动重启
"watch":true,// 监控变化的目录,一旦变化,自动重启
"env": { // 自己去配置一些环境变量
"NODE_ENV": "development"
},
"ignore_watch": [ // 从监控目录中排除
"node_modules",
"logs"
],
},{
"name": "server2",//启动服务的名称
"script": "./index.js", //默认是启动.js文件 后端启动
"cwd": "F:/bona/echarts-export-server(node生成echarts图片)/src", //绝对路径: windows文件目录
"max_memory_restart": "1G", // 最大内存重启
"autorestart": true, // 自动重启
"watch":true,// 监控变化的目录,一旦变化,自动重启
"env": { // 自己去配置一些环境变量
"NODE_ENV": "production"
},
"ignore_watch": [ // 从监控目录中排除
"node_modules",
"logs"
],
}]
};
更多配置说明:
{
"apps": [
{
"name": "server",
"script": "production.js", //默认是启动.js文件 后端启动
"args" : "aaa bbb 666",//参数:通过process.argv获取
"cwd": "/home/www/supermarket-system", //绝对路径: linux文件目录
"exec_mode": "fork", // fork:分叉模式(默) cluster:集群模式
"max_memory_restart": "1G", //默认150M, 最大内存重启
"autorestart": true, // 自动重启
"interpreter":"/usr/bin/python",//解释器:绝对路径,默认是node.exe
"env": {}, // 自己去配置一些环境变量
"watch": [ //默认值是true,也可设置为数组。 监控变化的目录,一旦变化,自动重启
"bin",
"routers"
],
"ignore_watch": [ // 从监控目录中排除
"node_modules",
"logs",
"public"
],
"watch_options": {
"followSymlinks": false
},
"error_file": "./logs/app-err.log", // 错误日志路径
"out_file": "./logs/app-out.log" // 普通日志路径
}
]
}
pm2部署node频繁重启问题排查, 通过pm2 list命令观察状态时发现重启次数异常(555次)。
id | name | namespace | version | mode | pid | uptime | ↺ | status | cpu | mem | user | watching |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | server | default | N/A | fork | 18888 | 44s | 555 | online | 1% | 28.6mb | Adm… | enabled |
- 程序出现异常,未捕获,导致线程退出。
- Promise状态为rejected未捕获异常,导致线程退出。
- 发送退出信号,退出线程。 调用process.ext()退出。
- 纯js(没启动服务与端口的js),也会一直重启。
node index.js arg1 arg2
pm2 start index.js -- arg1 arg2
上面两个等价,获取参数的方法【process.argv】
返回一个数组如下:
[
'/usr/bin/node',
'/usr/lib/node_modules/pm2/lib/ProcessContainerFork.js',
'arg1',
'arg2'
]
process.env.NODE_ENV = "production";//生产环境
process.env.NODE_ENV = "development";//开发环境
process.env.NODE_ENV = "test";//测试环境
清除PM2日志,只需要使用以下命令即可: pm2 flush 这条命令将会清除PM2志文件夹中所有的日志文件,从而释放磁盘空间。
注意:配置文件发生更改,如没能生效,请pm2 delete all,再执行启动命令。
参考链接:
https://pm2.keymetrics.io/docs/usage/application-declaration/#generate-configuration (pm2官网)
https://blog.csdn.net/z591102/article/details/124624831 (pm2常用命令汇总)