直接上干货,对于入门pm2守护进程的同学来说或许有些许帮助,若有错误欢迎指正
关于pm2,基础类的都不再多说了,守护进程的好处想必接触过的人都深有体会,今天主要来总结下近几天对于pm2一些学习型的研究
操作系统 mac
除了基本的通过配置文件启动pm2以外,个人比较喜欢的是通过脚本来启动,那么或许有人会问了,你通过一个配置文件去启动,和你通过脚本导入配置项再启动,究竟有什么差别?
配置文件启动(请忽略下图中的exports):
通过脚本(调用pm2提供的api)启动
没错,两者就此功能来说,没多大区别,但是通过api来启动则会有更多的可拓展性,只要你敢想,只要你有需求,肯定会对pm2的这些可拓展性发出一些不可描述的惊叹
首先,一个案例,倘若项目有功能需要进行计时器功能实现某个时刻执行某项任务,或者说按条件执行某项任务。
那么问题来了,单进程单机跑项目的时候没多大毛病,但是一旦你开始集群了,最简单的就是 pm2 start -i 这种情况,想必应该都熟悉,会出现重复操作吧?
那么有同学肯定会说,如果是操作类似redis的,我可以通过加锁来实现对数据的控制,操作文件的我可以通过文件锁来进行控制,还可能会有人想到独立出该模块单独跑一个进程,或者通过队列去控制执行与否
没错,这些都是解决方案,在不说效率高低与资源浪费的前提下,这些都是不错的选择,然而,或许我们有更好的解决方案?
我们都知道,pm2的集群是基于cluster模块的,自己尝试着写过cluster的应该都知道,我们可以通过master进程与work进程之间的通讯轻松控制任务的进行,而pm2作为守护进程,通过它启动的项目都是跑在它开辟的进程下的,我们不能直接通过修改pm2的源码去实现通过pm2来控制项目各进程的任务进行,没关系,功能强大的pm2给我们提供了内置的api来让我们可以通过这些api来实现站在pm2的视角上控制我们的app
我们常用的pm2命令,包括pm2 start/list/delete 等等,在pm2提供的api上都可以利用,相信熟悉pm2命令的小伙伴应该能很快上手,而今天主要介绍的就是pm2提供的进程通讯
通过API让pm2对某个process发出信息
pm2.sendDataToProcessId(current_id, {
type:'process:msg',
data:{
msg:'就决定是你了,pm2 id 为'+current_id+'的work进程'
},
topic:"pm2 message"
},function(err,res) {
if(err==null) {
console.log("success");
}
});
//current_id为pm2下进程的id,可以通过pm2.list等方式获取
在你的项目里写上接受的代码:
process.on('message',function(packet) { })
那么,在项目启动后,发送的目标进程就可以顺利接收到该信息,从而可以拓展开进行你的业务逻辑,同样的,pm2下的进程也可以发送信息到守护进程,而pm2也提供了相关api去接收
pm2.launchBus(function(err,pm2_bus) {
pm2_bus.on('process:msg',function(packet) {
console.log(packet);
});
});
←_←话不多说赶快上车
接下来要介绍的是另外一个pm2提供的让人很舒服的功能pm2-module-system
这玩意是拿来干嘛的呢,简单来说,如果把pm2比作一款游戏,那么它就是这款游戏的插件,你可以主动提供自己的功能,在pm2上拓展开来,官网上就有示例,也是我接下去要讲的module
pm2的日志分割模块,很实用的一个模块,通过拓展pm2的log可以很方便的管理项目的log,忍不住去上手尝试了下,然而发现了点让人很不舒服的地方。
可以看到pm2-logrotate对日志的切割是采用pm2进程下的app来进行操作的
但是这样忽略了集群下的情况,导致一开始我在用的时候出现了多次删除旧日志的错误抛出
虽然没什么大碍,但是总影响体验,并且会造成不必要的错误日志生成(logrotate的日志)
所以自己做了下小改动,采取pm2环境变量中app输出日志的路径来进行操作(之所以不采用直接过滤app name是因为pm2的log可以按进程输出)这样就可以确保不进行多余的操作
修改后的源码就不贴了,这么简单的小改动就不拿来献丑了_(:зゝ∠)_
感兴趣的同学也可以自己利用pmx和pm2module编写一些实用的外挂造福大众
pm2 module总体来说就是通过pmx.initModule加载你自己的module到pm2下,当然每个module都可以自己写入自己需要的配置项来进行业务逻辑的处理
最后还有个小彩蛋
pm2 monit界面的这玩意应该很多人都看到过,它同样是提供了对外接口来让我们可以在项目架设起来后进行一些直观的可视化操作
同样是通过pmx