1.前言
上一篇文章介绍了如何安装pm2,那么pm2是什么东西呢,它是一个管理node进程的一个工具,可以管理很多任务,如性能监控、自动重启、负载均衡等,并且node.js 是单进程,进程被杀死后整个服务就崩了,所以我们更需要进程管理工具。
2.基本使用
如果没有用pm2,我们启动node 可能会 cd 到某个路径下 然后 npm start
cd /opt/nginx/html/web/expressServer/
npm start
然后需要关的时候就需要杀死这个进程。
如果有pm2管理node进程就方便多了,pm2 start www启动node进程。下面id为pm2管理的id,pid为进程id。
pm2 stop www 停止node进程。
pm2 stop all 可以停止所有进程。
pm2 restart www 重启进程,可以发现www重启之后pid发生了变化从0(停止)到13711(重启后)
pm2 delete all 删除所有进程和pm2 delete app 删除app进程。
还有很多命令请看下面,我就不一一列举了,我这里也从网上翻过来的
// 启动命令
pm2 start www // 启动nodeJs应用,进程的默认名称为文件名app
pm2 start www --name mynode // 启动node,并指定进程名称为mynode
pm2 start www - i max // 根据有效CPU数目启动最大进程数目
pm2 start www - i 3 // 启动3个进程
pm2 start www --watch // 实时监控的方式启动,app.js文件有变动时,pm2会自动reload
pm2 start www - x // 用fork模式启动 app.js 而不是使用 cluster
pm2 start www - x– - a 23 // 用fork模式启动 app.js 并且传递参数(-a 23)
pm2 start app.json // 启动进程, 在app.json里设置选项
pm2 start www - i max– - a 23 // 在 – 之后给 www.js 传递参数
pm2 start www - i max - e err.log - o out.log // 启动并生成一个配置文件
// 查看与监视进程
pm2 list | pm2 ls // 显示所有进程;
pm2 show 0 | pm2 info 0 // 查看进程id为0的详细信息
pm2 monit // 进入监视页面,监视每个node进程的CPU和内存的使用情况
// 停止、删除进程
pm2 stop 0 // 停止id为0的进程
pm2 stop all // 停止所有进程
pm2 delete 0 // 删除id为0的进程
pm2 delete all // 删除所有进程
// 重启、重载
pm2 restart 0 // 重启id为0的进程
pm2 restart all // 重启所有进程
pm2 reload 0 // 0秒停机重载id为0进程(用于 NETWORKED 进程)
pm2 reload all // 重载所有进程
// 日志操作
pm2 logs // 显示所有进程的日志
pm2 logs 0 // 显示进程id为0的日志
pm2 flush // 清空所有日志文件
pm2 reloadLogs // 重载所有日志
pm2 startup // 产生init脚本,保持进程活着
// 杀死PM2进程
pm2 kill
3.pm2解决项目中碰到的问题
目前项目有个功能是文件升级,这个是功能是通过文件上传完成的,上传完成之后,前端需要启动node服务去执行一个xshell脚本,这个脚本的目的就是把前端的代码和后端的代码都要拷贝到相对应的文件目录下,然后重启docker容器完成文件升级,这里有可能需要更新node服务的代码,所以用传统的杀死进程根本无法做到(杀死之node就崩了),所以这里更新了node代码需要用到pm2 restart 命令去重启node服务,当代码拷贝完成,自动重启node服务,完美解决升级问题
let exec = require('child_process').exec;
router.get('/restartNode', function (req, res, next) {
exec("pm2 restart www", function (err, stdout, stderr) {
if (err) {
res.send({
"code": 500,
"message": "失败",
"result": "fail",
"content": stderr
});
} else {
res.send({
"code": 200,
"message": "重启成功",
"result": "success",
"content": stdout
});
}
});
});
module.exports = router;