如何使用PM2做進程管理
注意:?由于微信的限制,本文中的超鏈接可能不會在文中顯示,建議點擊文末的?閱讀原文?查閱。
簡介
什么是PM2?
PM2?P(rocess) M(anager) 2?是一個內(nèi)建了負載均衡器的守護進程管理器,可以幫助我們進行應(yīng)用程序管理。通過PM2,可以保持我們的服務(wù)?7*24?在線,并且在服務(wù)重載的時候可以保證零停機。
PM2創(chuàng)建初期時專門為Node.js應(yīng)用打造的,所以PM2是依賴于Node.js的。當前PM2的穩(wěn)定版本是?5.0.3,適用于所有 Linux, macOS 和 Windows的穩(wěn)定版本,并且支持?Node.js 12.X?開始的所有 Node.js。
PM2項目的原始資料
此處記錄一下PM2的官網(wǎng)資料傳送門,防止迷路,其中資料都是英文的。如果你想先簡單了解一下可以跳過這部分直接看下面的 如何安裝PM2 章節(jié)。
?PM2 在 Github 上的項目?PM2 在 npm 上的介紹?PM2 的商業(yè)官方站點
PM2的特性

以上是官網(wǎng)站點上對PM2全特性的標簽,上面的單詞都很容易懂,就不做翻譯了。如果你想了解更多相關(guān)特性的細節(jié),可以前往 官方站點 首頁查閱。
快速上手
本章節(jié)默認您的環(huán)境已經(jīng)安裝了Node.js, 如果您沒有安裝請先提前安裝Node.js。點擊下載Node.js
安裝PM2
1.使用 NPM 安裝:
$ npm install pm2 -g2.使用 YARN 安裝:
$ yarn global add pm23.如果您沒有Node.js,嘗試使用如下安裝方式:?注意:本人嘗試沒成功,可能站點已經(jīng)移除了,不建議使用wget -qO- https://getpm2.com/install.sh | bash啟動應(yīng)用
首先準備一個如下的Node.js服務(wù)器腳本,腳本名我們定為?app1.js。
const http =require('http')const hostname ='127.0.0.1'const port =3001const server = http.createServer((req, res)=>{res.statusCode =200res.setHeader('Content-Type','text/plain')res.end('My Application 1\n')})server.listen(port, hostname,()=>{console.log(`服務(wù)器運行在 http://${hostname}:${port}/`)})
使用如下命令來啟動上述應(yīng)用。
$ pm2 start app1.js
上圖顯示我們已經(jīng)將app1啟動成功了,驗證一下:

啟動語法介紹
使用?pm2 start xxx?的語法方式,我們啟動 Node.js, Python, Ruby 以及其他在環(huán)境變量?$PATH?中設(shè)置了的二進制程序。例如:
$ pm2 start bashscript.sh$ pm2 start python-app.py --watch$ pm2 start binary-file ----port 1520
啟動命令可以使用的參數(shù)
# 指定應(yīng)用名稱--name <app_name># 監(jiān)視并且在文件發(fā)生變更時重啟應(yīng)用--watch# 設(shè)置應(yīng)用重新加載的內(nèi)存閾值--max-memory-restart <200MB># 指定日志文件--log <log_path># 將額外的參數(shù)傳遞給腳本-- arg1 arg2 arg3# 自動重啟間的延遲--restart-delay <delay in ms># 給日志加上時間戳前綴--time# 禁用自動重啟應(yīng)用--no-autorestart# 設(shè)置 cron 強制重啟--cron <cron_pattern># 附加到應(yīng)用程序日志--no-daemon
更多參數(shù)查看使用?pm2 -h?或?pm2 start -h?命令查看。
進程管理
你可以復制上面的?app1.js?多創(chuàng)建幾個服務(wù)來邊寫邊練。記得修改每個js中的端口號,并使其不同。復制并修改完成后,您可以結(jié)合上面的啟動命令并加上不同的參數(shù)來啟動多個服務(wù)。
通過如下的命令可以列出正在運行中的服務(wù)列表:
$ pm2 list顯示結(jié)果可能如下,結(jié)果會根據(jù)您啟動的服務(wù)不同而不同。

管理命令
PM2的管理命令都很簡單直白,具體如下:
?列出運行中的服務(wù)列表,下面三種方式都可以
$ pm2 list$ pm2 ls$ pm2 status?停止應(yīng)用
$ pm2 stop <app_name|namespace|id|'all'|json_conf>?重啟應(yīng)用$ pm2 restart <app_name|namespace|id|'all'|json_conf>?刪除應(yīng)用$ pm2 delete<app_name|namespace|id|'all'|json_conf>?查看指定應(yīng)用詳情$ pm2 describe <id|app_name>$ pm2 show <id|app_name>?監(jiān)控日志,自定義智標和應(yīng)用信息
$ pm2 monit日志命令
?顯示實時日志:
$ pm2 logs?顯示較早的日志:
$ pm2 logs --lines 200集群模式
對于 Node.js 應(yīng)用程序,PM2 包括一個自動負載平衡器,它將在每個衍生進程之間共享所有 HTTP[s]/Websocket/TCP/UDP 連接。使用如下命令進行集群模式啟動,其中?max?的值為當前系統(tǒng)的?CPU核心數(shù)減1?,當然我們也可以改成任意數(shù)字,表示集群的實例數(shù):
$ pm2 start app.js -i max零離線重載
熱重載允許在不停機的情況下更新應(yīng)用程序。使用如下命令:
$ pm2 reload all注:上面的all表示所有的服務(wù)進程,除此之外還可以使指定id, 或應(yīng)用名稱
開機啟動
$ pm2 startup凍結(jié)進程列表并自動復位:
$ pm2 savePM2更新
簡單直白的方法:
$ npm install pm2@latest -gPM2常用命令示例
# Fork modepm2 start app.js --name my-api # Name process# Cluster modepm2 start app.js -i 0# Will start maximum processes with LB depending on available CPUspm2 start app.js -i max # Same as above, but deprecated.pm2 scale app +3# Scales `app` up by 3 workerspm2 scale app 2# Scales `app` up or down to 2 workers total# Listingpm2 list # Display all processes statuspm2 jlist # Print process list in raw JSONpm2 prettylist # Print process list in beautified JSONpm2 describe 0# Display all informations about a specific processpm2 monit # Monitor all processes# Logspm2 logs [--raw]# Display all processes logs in streamingpm2 flush # Empty all log filespm2 reloadLogs # Reload all logs# Actionspm2 stop all # Stop all processespm2 restart all # Restart all processespm2 reload all # Will 0s downtime reload (for NETWORKED apps)pm2 stop 0# Stop specific process idpm2 restart 0# Restart specific process idpm2 delete0# Will remove process from pm2 listpm2 delete all # Will remove all processes from pm2 list# Miscpm2 reset <process># Reset meta data (restarted time...)pm2 updatePM2 # Update in memory pm2pm2 ping # Ensure pm2 daemon has been launchedpm2 sendSignal SIGUSR2 my-app # Send system signal to scriptpm2 start app.js --no-daemonpm2 start app.js --no-vizionpm2 start app.js --no-autorestart
我們還可以使用命令?pm2 examples?來查閱常用命令示例。
高級特性
PM2的配置文件
PM2的配置文件叫做生態(tài)系統(tǒng)文件(Ecosystem File),它管理著眾多的應(yīng)用。使用如下命令可以生成一個生態(tài)系統(tǒng)文件:
$ pm2 ecosystem上面的命令執(zhí)行完畢可以生成一個文件名為?ecosystem.config.js?的文件,內(nèi)容大致如下:
module.exports ={apps :[{script:'index.js',watch:'.'},{script:'./service-worker/',watch:['./service-worker']}],deploy :{production :{user :'SSH_USERNAME',host :'SSH_HOSTMACHINE',ref:'origin/master',repo :'GIT_REPOSITORY',path :'DESTINATION_PATH','pre-deploy-local':'','post-deploy':'npm install && pm2 reload ecosystem.config.js --env production','pre-setup':''}}};
我們可以修改上述配置文件,然后使用命令?pm2 start ecosystem.config.js?的方法來啟動新的服務(wù)。
這部分在這里就不多講了,因為內(nèi)容很多。如果您想了解更多關(guān)于PM2生態(tài)系統(tǒng)文件的內(nèi)容以及配置文件中每個字段的屬性和含義可以在官方文檔中找到。點此查看 PM2 ecosystem 使用指導
為什么這里要提這個PM2 ecosystem,而不愿意多講呢。因為下面要講的如何使用PM2來啟動和管理非Node.js程序 (例如:Spring Boot項目),會用到這個特性,所以先給大家混個眼熟。
使用PM2管理非Node.js項目
命令行方式
PM2管理非Node.js最簡單的方式是在?pm2 start xxx?這樣啟動的命令行中,加上?--interpreter?來指定解釋執(zhí)行器來達到執(zhí)行非Node.js項目的目的,例如:
$ pm2 start my_app.py --interpreter '/usr/bin/python'$ pm2 start my_app.bat --interpreter 'cmd.exe'
生態(tài)系統(tǒng)文件方式
上一節(jié)大概知道了pm2有一個生態(tài)系統(tǒng)文件,下面簡單介紹一下如何使用生態(tài)文件系統(tǒng)配置的方式來指定我們的執(zhí)行程序。
創(chuàng)建配置文件
使用如下命令即可生成一個簡單的配置文件。
$ pm2 init simple執(zhí)行完畢后,生成的?ecosystem.config.js, 內(nèi)容如下:
module.exports ={apps :[{name :"app1",script :"./app.js"}]}
注意?:您如果要重新修改上述配置的文件名或者手動創(chuàng)建配置文件,則必須保證文件的后綴為?.config.js?,要不然PM2無法識別。
自定義編寫配置文件
此處以執(zhí)行 Spring Boot 項目為例來說明,更多的配置文件說明請查閱 官網(wǎng)文檔。
module.exports ={apps :[{name :"app6",script :"java.exe","args":["-jar","app6.jar"],"exec_interpreter":"","exec_mode":"fork"}]}
以上配置文件參數(shù)說明如下:
?name?進程名稱(顯示在pm2 list命令中)?script?執(zhí)行進程名稱,如果需要執(zhí)行PHP腳本則填寫php解釋器的路徑,本文為java?args?傳給執(zhí)行進程的參數(shù),多個參數(shù)以數(shù)組單元分割?exec_interpreter?NodeJs解析器,本文不適用?exec_mode?執(zhí)行模式[cluster|fork]這個針對NodeJs應(yīng)用的配置,非NodeJs應(yīng)用統(tǒng)一fork
啟動服務(wù)
假設(shè)上面的配置文件我們命名為了?app6.config.js,則使用如下命令啟動:
$ pm2 start app6.config.js
至此我們已經(jīng)成功的使用PM2將?Spring Boot?項目管理起來了。
執(zhí)行配置文件中的部分服務(wù)
細心的你是否發(fā)現(xiàn)了上面的配置文件中?app?的值是一個數(shù)組,這就意味著我們可以在一個配置文件中配置多個服務(wù)。假如我們的配置文件中有三個名字分別為?app1,?app2,?app3?的三個服務(wù),當我們想啟動部分服務(wù)時可以使用?--only?參數(shù)來完成。
啟動 app1:
$ pm2 start ecosystem.config.js --only "app1"啟動 app1 和 app3:
$ pm2 start ecosystem.config.js --only "app1,app3"注意:?--only?參數(shù)只能用在?start/restart/stop/delete?這些子命令中。
切換運行環(huán)境
我們可以使用配置文件中的?env_*?選項來指定不同的環(huán)境變量,例如:
module.exports ={apps :[{name :"app1",script :"./app.js",env_production:{NODE_ENV:"production"},env_development:{NODE_ENV:"development"}}]}
運行時切換環(huán)境很簡單,使用?--env [env name]?選項即可,例如:
$ pm2 start process.json --env production$ pm2 restart process.json --env development
重要的一點
本章節(jié)僅僅是介紹了一個配置文件的皮毛。僅僅可以讓你對配置文件有個簡單的了解并且通過簡單配置可以執(zhí)行非Node.js的項目。但是PM2的配置文件的配置項很多,建議讀者還是去 官網(wǎng)文檔 看看都有那些配置項,這樣能更好的幫助您定制化自己所期望的服務(wù)治理。
最后
如同在 PM2的特性 章節(jié)中所列出的一樣,PM2還有很多特性是在本片文章中沒有介紹的。如果你對PM2比較感興趣,建議去 官方站點 翻閱相關(guān)資料。
注意:?由于微信的限制,本文中的超鏈接可能不會在文中顯示,建議點擊文末的?閱讀原文?查閱。
歡迎關(guān)注我的公眾號“須彌零一”,更多技術(shù)文章第一時間推送。
