pm2 进程管理工具可以Windows操作系统上运行,当一台Windows电脑上需要运行多个进程时,或者运维时需要运行多个进程以提供服务时。可以使用pm2,而不再是使用脚本。
1. 使用PM2管理进程
1.1. 启动PM2项目
1.1.1. 直接启动项目
参数说明:
--watch
:监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。-i --instances
:启用多少个实例,可用于负载均衡。如果-i 0
或者-i max
,则根据当前机器核数确定实例数目。--ignore-watch
:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "some scripts""
-n --name
:应用的名称。查看应用信息的时候可以用到。-o --output <path>
:标准输出日志文件的路径。-e --error <path>
:错误输出日志文件的路径。--interpreter <interpreter>
:the interpreter pm2 should use for executing app (bash, python…)。比如你用的coffee script来编写应用。
pm2支持直接运行server.js启动项目,如下:
## 1.2. 查看应用列表(查看当前机器执行的所有进程)
1.2.1. 查看所有应用的情况
pm2 list
1.2.2. 查看某一个应用的情况
# pm2 show app_name|app_id
pm2 show 0
pm2 show hbbuild_gq
# pm2 describe app_name|app_id
pm2 describe 0
pm2 describe hbbuild_gq
1.3. 重启、停止、删除
1.3.1. 重启
# pm2 show app_name|app_id|app.ks
pm2 restart hbbuild_gq.js
pm2 restart hbbuild_gq
pm2 restart 0
1.3.2. 停止
#停止特定的应用。可以先通过`pm2 list`获取应用的名字(--name指定的)或者进程id。
pm2 stop app_name|app_id
#如果要停止所有应用,可以
pm2 stop all
1.3.3. 删除
# 删除某一个应用
pm2 delete app_name|app_id
# 删除所有的应用
pm2 delete all
1.4. 日志
pm2 log 0
1.4.1 查看最新的日志
pm2 logs 0 --lines --raw
# 例如:
pm2 logs 0 --lines 3
1.5. 负载均衡
命令如下,表示开启三个进程。如果-i 0
,则会根据机器当前核数自动开启尽可能多的进程。
pm2 start hbbuild_gq.js -i 3 # 开启三个进程
pm2 start hbbuild_gq -i max # 根据机器CPU核数,开启对应数目的进程
1.6. 内存使用超过上限自动重启
如果想要你的应用,在超过使用内存上限后自动重启,那么可以加上--max-memory-restart
参数。(有对应的配置项)
pm2 start hbbuild_gq.js --max-memory-restart 20M
1.7. 保存/冻结进程
在重新启动时保存/冻结进程列表
pm2 save
2. 总结
微服务平台,总是表现为多个服务多个机器分布式运行,资源和算力拓展了,管理等复杂度提升了。
可能两个服务登录不同机器,查看日志还容易,当服务到达成百上千的时候问题就很明显。
所以,我们需要(孵化)像pm2这样的工具,提供下面的便利:
开发和运维上的便利
- 无缝接入服务管理
这个对NodeJS应用来说,几乎是神器,pm2 原生地支持了应用程序管理,提供了命令管理查看用户应用。
举Springboot开发的微服务平台为例,开发应用的同学需要引入SpringCloud等组件进行服务发现,注册到注册中心。本人也使用过春天全家桶来制作微服务平台,再简化还得定制一个通用SpringBoot Starter,理念也是类似的!
- 统一管理日志工作台
特别是在微服务环境下,多个服务,使用pm2 monit,可以很方便的一个monit工作台切换微服务日志。大型平台那就需要做日志搜索了,比较成百上千个服务在pm2 monit窗口切换也不现实,这也是pm2缺少的地方!
不过,pm2还有一个在线版的Keymetics 做专业微服务平台监控管理的工作台(收费)。
- 更容易的应用弹性伸缩
上面启动后台服务的时候,加了一个-i参数,指定数量就能启动多worker服务。
虽然在NodeJS中还是单进程多线程,但是这个参数化实例拓展,这个设计是很有指导意义的!
- 服务启动/恢复操作的封装,原子性
我们使用pm2 start/stop appname即可,而非开发进入多个应用目录手动打node app.js。再者pm2会常驻应用保证应用不掉线,这个设计也是值得参考。