在前端开发中,我们常常需要管理多个进程的运行,例如 Node.js 服务器、前端打包工具等。而 PM2 是一款优秀的多进程管理工具,可以帮助我们轻松管理多个进程的运行状态,同时提供故障恢复机制,保证进程的高可用性。
PM2 简介
PM2 是一款基于 Node.js 的进程管理工具,可以帮助我们管理多个 Node.js 进程,支持进程守护、负载均衡、故障恢复等功能。PM2 的主要特点包括:
- 支持多进程管理,可以启动、停止、重启多个 Node.js 进程;
- 支持进程守护,可以在进程崩溃时自动重启进程;
- 支持负载均衡,可以根据 CPU 核数等参数自动分配进程;
- 支持故障恢复,可以在进程崩溃时自动恢复进程;
- 支持日志管理,可以记录进程的日志信息;
- 支持远程部署,可以在多台服务器上部署和管理进程。
PM2 的安装
PM2 可以通过 npm 安装,执行以下命令即可:
npm install pm2 -g
安装完成后,可以通过以下命令查看 PM2 的版本号:
pm2 -v
PM2 的使用
启动进程
使用 PM2 启动进程非常简单,只需要执行以下命令即可:
pm2 start app.js
其中,app.js 是要启动的 Node.js 应用程序的入口文件。PM2 会自动将该进程作为守护进程启动,并记录进程的日志信息。
查看进程列表
启动进程后,可以使用以下命令查看当前 PM2 管理的进程列表:
pm2 ls
该命令会列出当前所有的进程信息,包括进程 ID、进程名称、状态、CPU 和内存占用等信息。
停止进程
如果需要停止某个进程,可以使用以下命令:
pm2 stop app
其中,app 是要停止的进程名称。如果需要停止所有进程,可以执行以下命令:
pm2 stop all
重启进程
如果需要重启某个进程,可以使用以下命令:
pm2 restart app
其中,app 是要重启的进程名称。如果需要重启所有进程,可以执行以下命令:
pm2 restart all
删除进程
如果需要删除某个进程,可以使用以下命令:
pm2 delete app
其中,app 是要删除的进程名称。如果需要删除所有进程,可以执行以下命令:
pm2 delete all
PM2 的故障恢复机制
PM2 提供了强大的故障恢复机制,可以在进程崩溃时自动重启进程,保证进程的高可用性。默认情况下,PM2 会在进程崩溃时尝试重启进程,最多尝试 15 次。如果在 15 次重试后仍然无法恢复进程,则会停止重试。
设置故障恢复参数
可以通过设置 PM2 的故障恢复参数来修改故障恢复的行为。例如,可以设置最大重试次数、重试间隔时间等参数。以下是一些常用的故障恢复参数:
- max_restarts:最大重试次数,默认为 15;
- min_uptime:进程最小运行时间,默认为 1000 毫秒;
- restart_delay:重试间隔时间,默认为 1000 毫秒;
- exp_backoff:指数级退避策略,如果设置为 true,则会每次重试的间隔时间会逐渐增加。
可以通过以下命令设置故障恢复参数:
pm2 start app.js --max-restarts 10 --min-uptime 5000 --restart-delay 2000 --exp-backoff
监听进程崩溃事件
可以通过监听 PM2 的进程崩溃事件来自定义故障恢复行为。例如,可以在进程崩溃时发送邮件、短信等通知,或者执行一些其他的自定义操作。以下是一个示例代码:
pm2.on('exit', function(app) {
console.log('Process %s has stopped', app.name);
// TODO: 进程崩溃时的自定义操作
});PM2 的负载均衡
PM2 支持多种负载均衡策略,可以根据 CPU 核数、内存占用等参数自动分配进程。以下是一些常用的负载均衡策略:
- cluster_mode:使用 Node.js 的 cluster 模块实现负载均衡,默认为 false;
- instances:指定要启动的进程数量;
- max_memory_restart:当进程内存占用超过指定值时自动重启进程。
可以通过以下命令设置负载均衡参数:
pm2 start app.js --name "app" --instances 4 --max-memory-restart 200M --cluster-mode
结语
PM2 是一款非常优秀的多进程管理工具,可以帮助我们轻松管理多个进程的运行状态,同时提供故障恢复机制,保证进程的高可用性。在实际项目中,合理使用 PM2 可以提高系统的可靠性和稳定性。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d8ca16a941bf7134f5c132