直接上干貨,對于入門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