PM2是什么
PM2(Process Manager 2 )是具有内置负载均衡器的Node.js应用程序的生产运行时和进程管理器。 它允许您永久保持应用程序活跃,无需停机即可重新加载它们,并促进常见的Devops任务。
PM2特性
日志管理:应用程序日志保存在服务器的硬盘中~/.pm2/logs/
负载均衡:PM2可以通过创建共享同一服务器端口的多个子进程来扩展您的应用程序。这样做还允许您以零秒停机时间重新启动应用程序。
终端监控:可以在终端中监控您的应用程序并检查应用程序运行状况(CPU使用率,使用的内存,请求/分钟等)。
SSH部署:自动部署,避免逐个在所有服务器中进行ssh。
静态服务:支持静态服务器功能
多平台支持:适用于Linux(稳定)和macOS(稳定)和Windows(稳定)
PM2安装
1 | npm install pm2 -g |
PM2使用
启动服务
1 | pm2 start app.js //启动app.js应用 |
停止服务
1 | pm2 stop all //停止所有应用 |
删除应用
1 | pm2 delete all //关闭并删除应用 |
创建开机自启动
1 | pm2 startup |
更新PM2
1 | pm2 updatePM2 |
监听模式
1 | pm2 start app.js --watch //当文件发生变化,自动重启 |
静态服务器
1 | pm2 serve ./dist 9090 //将目录dist作为静态服务器根目录,端口为9090 |
启用群集模式(自动负载均衡)
1 | //max 表示PM2将自动检测可用CPU的数量并运行尽可能多的进程 |
重新启动
1 | pm2 restart app.js //同时杀死并重启所有进程。短时间内服务不可用。生成环境推荐使用reload |
0秒停机重新加载
1 | pm2 reload app.js //重新启动所有进程,始终保持至少一个进程在运行 |
查看启动列表
1 | pm2 list |
查看每个应用程序占用情况
1 | pm2 monit |
显示应用程序所有信息
1 | pm2 show [Name] //根据name查看 |
日志查看
1 | pm2 logs //查看所有应用日志 |
保存当前应用列表
1 | pm2 save |
重启保存的应用列表
1 | pm2 resurrect |
清除保存的应用列表
1 | pm2 cleardump |
保存并恢复PM2进程
1 | pm2 update |
执行npm命令
1 | pm2 start npm -- run dev # 等同于 npm run dev |
可能报错:Created by npm, please don’t edit manually.
解决方案主要有2种:
pm2 start "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js" --name "xxx" -- run start(该方式会产生无法关闭的cmd窗口,不推荐)Create
pm2-npm.js(I did similar foryarnand it works fine):
1
2
3
4
5
6
7 const { execSync } = require("child_process");
// first two args can be ignored rest will be passed directly to the npm command
const [ingore, ignore2, ...args] = process.argv;
// windowsHide option will hide the cmd window
execSync(`npm ${args.join(" ")}`, { windowsHide: true, stdio: "inherit" });Use above script to start a new process with
pm2:
1 pm2 start ./pm2-npm.js --name <name> -- startThis would execute
npm start.参考:[2]、[3]
PM2配置文件方式
生成示例配置文件
1 | pm2 ecosystem //生成一个示例JSON配置文件 |
配置文件示例(实际使用自行删除)
1 | module.exports = { |
window下使用
window有时候需要后台运行node程序,不系统cmd窗口一直打开,这时候就可以借助pm2
与linux下不同的是,window下需要安装自启动包
1 | # 全局安装 |
请教一下windows电脑重启之后pm2 中的服务没有自动启动
方法1:先pm2 start 运行你要开机启动的程序, 再
pm2 save,看看/.pm2/dump.pm2这个文件检查是否真的保存住了。保存住了就可以pm2 startup(window下pm2 startup报错)方法2:第三方实现 pm2-windows-service
方法3:bat脚本 + pm2.json
pm2.bat
1
2
3
4 d:
cd D:\MyScripts\pm2
pm2 start ./pm2.json
pausepm2.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 {
"apps" : [{
"name" : "vue-my-site",
"cwd" : "D:\\MyCode\\vue-my-site-worktree",
"script" : "D:\\MyCode\\vue-my-site-worktree\\pm2-start.js",
"args": [
"npm",
"run",
"dev"
],
"log_date_format": "YYYY-MM-DD HH:mm:ss",
},{
"name" : "vue-my-server",
"cwd" : "D:\\MyCode\\vue-my-site-worktree\\server",
"script" : "D:\\MyCode\\vue-my-site-worktree\\pm2-start.js",
"args": [
"npm",
"run",
"serve"
],
"log_date_format": "YYYY-MM-DD HH:mm:ss",
},{
"name" : "cdn",
"cwd" : "E:\\cdn",
"script" : "D:\\MyCode\\vue-my-site-worktree\\pm2-start.js",
"args": [
"http-server",
"--cors",
"-p",
"2022"
],
"log_date_format": "YYYY-MM-DD HH:mm:ss",
}]
}pm2-start.js
1
2
3
4
5
6
7
8 const { execSync } = require("child_process");
// first two args can be ignored rest will be passed directly to the npm command
const [ingore, ignore2, ...args] = process.argv;
// windowsHide option will hide the cmd window
console.log('args.join(" ")', args.join(" "))
execSync(`${args.join(" ")}`, { windowsHide: true, stdio: "inherit" });在cmd中输入“gpedit.msc”,打开“组策略”窗口。依次“计算机配置→Windows设置→脚本(启动/关机)”节点,双击右侧详细资料窗格中的“启动”项目,单击“添加”按钮,将你所写的bat脚本添加为新的计算机启动脚本。
https://wohugb.gitbooks.io/pm2/content/features/json_app_declaration.html
参考文章
本文链接: http://www.ionluo.cn/blog/posts/a3fafc16.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
