注:2016年的文章,發在掘金上,不知道是否過期了。php
對於後臺進程的管理,經常使用的工具是crontab,可用於兩種場景:定時任務和常駐腳本。關於常駐腳本,今天介紹一款更好用的工具:pm2,基於nodejs開發的進程管理器,適用於後臺常駐腳本管理,同時對node網絡應用有自建負載均衡功能。官方的說法,pm2 是一個帶有負載均衡功能的Node應用的進程管理器,我的認爲,並不許確,由於pm2支持多種語言,只是對於除node以外的其餘進程無負載均衡的能力。html
先來講一下 pm2 有哪些優勢好處。node
以上簡要概述了pm2進程管理工具的特色。python
經常使用命令一般都是比較簡單。下面列舉一些pm2經常使用的管理命令linux
pm2 start [options] 啓動指定應用,如pm2 start index.js --name httpServer;git
pm2 stop [options] 中止指定應用,如pm2 stop httpServer;github
pm2 reload|restart [options] 重啓指定應用,如pm2 restart httpServer;web
pm2 show [options] 顯示指定應用詳情,如pm2 show httpServer;正則表達式
pm2 delete [options] 刪除指定應用,如pm2 delete httpServer,若是修改應用配置行爲,最好先刪除應用後,從新啓動方纔生效,如修改腳本入口文件;編程
pm2 kill 殺掉pm2管理的全部進程;
pm2 logs 查看指定應用的日誌,即標準輸出和標準錯誤;
pm2 monit 監控各個應用進程cpu和memory使用狀況;
pm2 配置方式 有兩種,分別是經過命令行和配置文件。
pm2 start index.js --name HttpServer --interpreter node
此處經過命令的選項配置應用名稱爲httpServer,index.js腳本文件解釋器爲node,更多選項可查看pm2 --help獲取;
pm2配置文件方式支持yml與json格式
processes.yml文件
processes.json
先來看看 PM2 支持的配置項,以下:
上面內容比較枯燥無味,下面是結合本身實踐中遇到的一些坑作的思考總結。
pm2啓動進程的支持兩種模式:fork與cluster,對於瞭解node的人知道,node的多進程編程api: child_process.fork與cluster。關於pm2的fork與cluster二者的本質區別,我的認爲就是node API的child_process.fork與cluster的區別,stackoverflow有關於這個問題的討論。下面作個粗淺的概括:
cluster是fork的派生,cluster支持全部cluster擁有的特性;
fork不支持socket地址端口複用,cluster支持地址端口複用。由於只有node的cluster模塊支持socket選項SO_REUSEADDR;
fork不能夠啓動多個實例進程,cluster能夠啓動多個實例。但node的child_process.fork是能夠實現啓動多個進程的,可是爲何沒有實現呢?就我的理解,node多爲提供網絡服務,啓動多個實例須要地址端口複用,此時即可使用cluster模式實現,但fork模式並不支持地址端口複用,多實例進程啓動會產生異常錯誤。但對於常駐任務腳本而言,不須要提供網絡服務,此時多進程啓動能夠實現,同時也提升了任務處理效率。對於上述需求,能夠兩種方式實現,一是配置app0,app1,app2方式啓動多個進程,二是經過應用實例自身調用child_process.fork多進程編程實現;
fork模式能夠應用於其餘語言,如php,python,perl,ruby,bash,coffee, 而cluster只能應用於node;
fork不支持定時重啓,cluster支持定時重啓。定時重啓也就是配置中的cron_restart配置項。github上面有做者關於fork模式下是否須要實現cron-like定時的討論:
官網文檔註明說,fork模式的定時重啓這個功能不久將實現,期待中吧... ...
pm2的監控有兩種方式,分別是 cli 和 keymetrics。
pm2 monit是專門用來監控的命令,監控項包括cpu與內存。缺點monit展現內容太過粗糙,不夠詳細
pm2 list展現當前全部pm2的管理項目,能夠查看出每一個進程的運行狀態。若是須要更詳細的監控內容,對於cli而言通常都是能夠實現的。
這種監控方式的缺點:
因爲這些缺點,就須要一種更好的方式去監控咱們的應用
keymetrics監控是PM2的開發者的開發和維護的一款監控工具,能夠嘗試一下,安裝配置很是容易,我也只是粗淺的嘗試了一下,能夠參考
本人對監控研究很少,這裏的監控主體是應用進程,非服務器,就只說說我比較喜歡的幾個功能:
可是,keymetrics是一款商業版的監控軟件,免費版功能有限,且只有兩臺服務器的免費配額,這款軟件的服務端非自建,採用的是將應用監控數據定時上拋第三平臺,對於有着衆多服務器的公司而言費用昂貴,並且服務器與應用服務進程等狀態信息是敏感性數據,接入到第三方平臺中沒法接受。固然,若是是服務器數量有限,可以支付昂貴的使用費用,無敏感數據等場景的話,推薦使用Keymetrics,畢竟是PM2的開發者的開發和維護,功能特性很豐富。
鑑於以上問題,國內牛人開發了一款相似的免費工具,本人沒有研究過,名字頗有趣: pm2.5。連接地址。
關於監控,本人經驗很少,就很少妄言了
日誌系統對於任意應用而言,一般都是必不可少的一個輔助功能。pm2的相關文件默認存放於$HOME/.pm2/目錄下,其日誌主要有兩類:
這裏之因此把日誌單獨說明一下是由於,若是程序開發不嚴謹,爲了調試程序,致使應用產生大量標準輸出,使服務器自己記錄大量的日誌,致使服務磁盤滿載問題。通常而言,pm2管理的應用自己都有本身日誌系統,因此對於這種沒必要要的輸出內容需禁用日誌,重定向到/dev/null。
與crontab比較,也有相似狀況,crontab自身日誌,與其管理的應用自己的輸出。應用腳本輸出必定須要重定向到/dev/null,由於該輸出內容會以郵件的形式發送給用戶,內容存儲在郵件文件,會產生意向不到的結果,或會致使腳本壓根不被執行;
PM2是一款很是優秀的Node進程管理工具,它有着豐富的特性:可以充分利用多核CPU且可以負載均衡、可以幫助應用在崩潰後、指定時間(cluster model)和超出最大內存限制等狀況下實現自動重啓。
我的幾點見解保證常駐應用進程穩定運行:
關於pm2的使用,主要仍是運用於常駐腳本。定時任務,更多仍是須要專門的定時任務管理工具crontab,不過crontab在使用中總會有各類不爽的問題,提供一個連接,關於crontab的問題,以及提出了一個新工具jobCenter,本人暫未仔細研究,粗略看了一下好像還不錯:地址
最後說明,文章中有些我的思考,望不影響他人判斷,若有錯誤,請指正,謝謝!