1. 程式人生 > >pm2常用命令和用法介紹

pm2常用命令和用法介紹

pm2常用的命令用法介紹

pm2 是一個帶有負載均衡功能的Node應用的程序管理器.當你要把你的獨立程式碼利用全部的伺服器上的所有CPU,並保證程序永遠都活著,0秒的過載, PM2是完美的,下面我們來看pm2常用的命令用法介紹吧。

PM2 (github上的原始碼)是開源的基於Nodejs的程序管理器,包括守護程序,監控,日誌的一整套完整的功能,基本是Nodejs應用程式不二的守護程序選擇,事實上它並不僅僅可以啟動Nodejs的程式,只要是一般的指令碼的程式它同樣可以勝任。

以下是pm2常用的命令列

$ pm2 start app.js              # 啟動app.js應用程式

$ pm2 start app.js -i 4
# cluster mode 模式啟動4個app.js的應用例項 # 4個應用程式會自動進行負載均衡 $ pm2 start app.js --name="api" # 啟動應用程式並命名為 "api" $ pm2 start app.js --watch # 當檔案變化時自動重啟應用 $ pm2 start script.sh # 啟動 bash 指令碼 $ pm2 list # 列表 PM2 啟動的所有的應用程式 $ pm2 monit # 顯示每個應用程式的CPU和記憶體佔用情況
$ pm2 show [app-name] # 顯示應用程式的所有資訊 $ pm2 logs # 顯示所有應用程式的日誌 $ pm2 logs [app-name] # 顯示指定應用程式的日誌 $ pm2 flush $ pm2 stop all # 停止所有的應用程式 $ pm2 stop 0 # 停止 id為 0的指定應用程式 $ pm2 restart all # 重啟所有應用 $ pm2 reload all # 重啟 cluster mode下的所有應用
$ pm2 gracefulReload all # Graceful reload all apps in cluster mode $ pm2 delete all # 關閉並刪除所有應用 $ pm2 delete 0 # 刪除指定應用 id 0 $ pm2 scale api 10 # 把名字叫api的應用擴充套件到10個例項 $ pm2 reset [app-name] # 重置重啟數量 $ pm2 startup # 建立開機自啟動命令 $ pm2 save # 儲存當前應用列表 $ pm2 resurrect # 重新載入儲存的應用列表 $ pm2 update # Save processes, kill PM2 and restore processes $ pm2 generate # Generate a sample json configuration file $ pm2 deploy app.json prod setup # Setup "prod" remote server $ pm2 deploy app.json prod # Update "prod" remote server $ pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2 $ pm2 module:generate [name] # Generate sample module with name [name] $ pm2 install pm2-logrotate # Install module (here a log rotation system) $ pm2 uninstall pm2-logrotate # Uninstall module $ pm2 publish # Increment version, git push and npm publish
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

簡介

PM2是node程序管理工具,可以利用它來簡化很多node應用管理的繁瑣任務,如效能監控、自動重啟、負載均衡等,而且使用非常簡單。

下面就對PM2進行入門性的介紹,基本涵蓋了PM2的常用的功能和配置。 
安裝

全域性安裝,簡直不能更簡單。 
​npm 
install -g pm2 
目錄介紹

pm2安裝好後,會自動建立下面目錄。看檔名基本就知道幹嘛的了,就不翻譯了。

    $HOME/.pm2 will contain all PM2 related files
    $HOME/.pm2/logs will contain all applications logs
    $HOME/.pm2/pids will contain all applications pids
    $HOME/.pm2/pm2.log PM2 logs
    $HOME/.pm2/pm2.pid PM2 pid
    $HOME/.pm2/rpc.sock Socket file for remote commands
    $HOME/.pm2/pub.sock Socket file for publishable events
    $HOME/.pm2/conf.js PM2 Configuration
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

入門教程

挑我們最愛的express應用來舉例。一般我們都是通過npm start啟動應用,其實就是呼叫node ./bin/www。那麼,換成pm2就是

注意,這裡用了–watch引數,意味著當你的express應用程式碼發生變化時,pm2會幫你重啟服務,多貼心。

pm2 start ./bin/www –watch

引數說明:

--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來編寫應用。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

完整命令列引數列表:地址

pm2 start app.js –watch -i 2

重啟

pm2 restart app.js

停止

停止特定的應用。可以先通過pm2 list獲取應用的名字(–name指定的)或者程序id。

pm2 stop app_name|app_id

如果要停止所有應用,可以

pm2 stop all

刪除

類似pm2 stop,如下

pm2 stop app_name|app_id pm2 stop all

檢視程序狀態

pm2 list

檢視某個程序的資訊

[root@iZ94wb7tioqZ pids]# pm2 describe 0 Describing process with id 0 - name oc-server 
┌───────────────────┬──────────────────────────────────────────────────────────────┐ 
│ status │ online │ 
│ name │ oc-server │ 
│ id │ 0 │ 
│ path │ /data/file/qiquan/over_the_counter/server/bin/www │ 
│ args │ │ 
│ exec cwd │ /data/file/qiquan/over_the_counter/server │ 
│ error log path │ /data/file/qiquan/over_the_counter/server/logs/app-err-0.log │ 
│ out log path │ /data/file/qiquan/over_the_counter/server/logs/app-out-0.log │ 
│ pid path │ /root/.pm2/pids/oc-server-0.pid │ 
│ mode │ fork_mode │ 
│ node v8 arguments │ │ 
│ watch & reload │ │ 
│ interpreter │ node │ 
│ restarts │ 293 │ 
│ unstable restarts │ 0 │ 
│ uptime │ 87m │ 
│ created at │ 2016-08-26T08:13:43.705Z │ 
└───────────────────┴──────────────────────────────────────────────────────────────┘

配置檔案 
簡單說明

配置檔案裡的設定項,跟命令列引數基本是一一對應的。
可以選擇yaml或者json檔案,就看個人洗好了。
json格式的配置檔案,pm2當作普通的js檔案來處理,所以可以在裡面添加註釋或者編寫程式碼,這對於動態調整配置很有好處。
如果啟動的時候指定了配置檔案,那麼命令列引數會被忽略。(個別引數除外,比如--env)
  • 1
  • 2
  • 3
  • 4
  • 5

例子

舉個簡單例子,完整配置說明請參考官方文件。

{ “name” : “fis-receiver”, // 應用名稱 “script” : “./bin/www”, // 實際啟動指令碼 “cwd” : “./”, // 當前工作路徑 “watch”: [ // 監控變化的目錄,一旦變化,自動重啟 “bin”, “routers” ], “ignore_watch” : [ // 從監控目錄中排除 “node_modules”, “logs”, “public” ], “watch_options”: { “followSymlinks”: false }, “error_file” : “./logs/app-err.log”, // 錯誤日誌路徑 “out_file” : “./logs/app-out.log”, // 普通日誌路徑 “env”: { “NODE_ENV”: “production” // 環境引數,當前指定為生產環境 } }

自動重啟

前面已經提到了,這裡貼命令列,更多點選這裡。

pm2 start app.js –watch

這裡是監控整個專案的檔案,如果只想監聽指定檔案和目錄,建議通過配置檔案的watch、ignore_watch欄位來設定。 
環境切換

在實際專案開發中,我們的應用經常需要在多個環境下部署,比如開發環境、測試環境、生產環境等。在不同環境下,有時候配置項會有差異,比如連結的資料庫地址不同等。

對於這種場景,pm2也是可以很好支援的。首先通過在配置檔案中通過env_xx來宣告不同環境的配置,然後在啟動應用時,通過–env引數指定執行的環境。 
環境配置宣告

首先,在配置檔案中,通過env選項宣告多個環境配置。簡單說明下:

env為預設的環境配置(生產環境),env_dev、env_test則分別是開發、測試環境。可以看到,不同環境下的NODE_ENV、REMOTE_ADDR欄位的值是不同的。
在應用中,可以通過process.env.REMOTE_ADDR等來讀取配置中生命的變數。
  • 1
  • 2
  • 3

“env”: { “NODE_ENV”: “production”, “REMOTE_ADDR”: “http://www.example.com/” }, 
​”env_dev”: { “NODE_ENV”: “development”, “REMOTE_ADDR”: “http://wdev.example.com/” }, 
​”env_test”: { “NODE_ENV”: “test”, “REMOTE_ADDR”: “http://wtest.example.com/” }

啟動指明環境

假設通過下面啟動指令碼(開發環境),那麼,此時process.env.REMOTE_ADDR的值就是相應的 http://wdev.example.com/ ,可以自己試驗下。

pm2 start app.js –env dev

負載均衡

命令如下,表示開啟三個程序。如果-i 0,則會根據機器當前核數自動開啟儘可能多的程序。

pm2 start app.js -i 3 # 開啟三個程序 
​ 
​pm2 start app.js -i max # 根據機器CPU核數,開啟對應數目的程序

參考文件:點選檢視 
日誌檢視

除了可以開啟日誌檔案檢視日誌外,還可以通過pm2 logs來檢視實時日誌。這點對於線上問題排查非常重要。

比如某個node服務突然異常重啟了,那麼可以通過pm2提供的日誌工具來檢視實時日誌,看是不是指令碼出錯之類導致的異常重啟。

pm2 logs

指令tab補全

執行pm2 –help,可以看到pm2支援的子命令還是蠻多的,這個時候,自動完成的功能就很重要了。

執行如下命令。恭喜,已經能夠通過tab自動補全了。細節可參考這裡。

pm2 completion install source ~/.bash_profile

Alt text 
開機自動啟動

可以通過pm2 startup來實現開機自啟動。細節可參考。大致流程如下

通過pm2 save儲存當前程序狀態。
通過pm2 startup [platform]生成開機自啟動的命令。(記得檢視控制檯輸出)
將步驟2生成的命令,貼上到控制檯進行,搞定。
  • 1
  • 2
  • 3
  • 4

傳入node args

直接上例子,分別是通過命令列和配置檔案。

命令列:

pm2 start app.js –node-args=”–harmony”

配置檔案:

{ “name” : “oc-server”, “script” : “app.js”, “node_args” : “–harmony” }

例項說明

假設是在centos下,那麼執行如下命令,搞定。強烈建議執行完成之後,重啟機器,看是否設定成功。

[root@iZ94wb7tioqZ option_analysis]# pm2 save 
​[root@iZ94wb7tioqZ option_analysis]# pm2 startup centos 
​[PM2] Generating system init script in /etc/init.d/pm2-init.sh 
[PM2] Making script booting at startup… 
[PM2] /var/lock/subsys/pm2-init.sh lockfile has been added 
[PM2] -centos- Using the command: 
su -c “chmod +x /etc/init.d/pm2-init.sh; chkconfig –add pm2-init.sh” 
​[PM2] Done. 
[root@iZ94wb7tioqZ option_analysis]# pm2 save 
​[PM2] Dumping processes

遠端部署

可參考官方文件,配置也不復雜,用到的時候再來填寫這裡的坑。TODO

執行如下命令,檢視當前通過pm2執行的程序的狀態。

pm2 monit

看到類似輸出

[root@oneday-dev0 server]# pm2 monit ⌬ 
​ PM2 monitoring (To go further check out https://app.keymetrics.io) [ ] 0 % ⌬ 
​PM2 monitoring (To go further check o[||||||||||||||| ] 196.285 MB 
​● fis-receiver [ ] 0 % [1] [fork_mode] [||||| ] 65.773 MB 
​● www [ ] 0 % [2] [fork_mode] [||||| ] 74.426 MB 
​● oc-server [ ] 0 % [3] [fork_mode] [|||| ] 57.801 MB 
​● pm2-http-interface [ ] stopped 
[4] [fork_mode] [ ] 0 B 
​● start-production 
[5] [fork_mode]

記憶體使用超過上限自動重啟

如果想要你的應用,在超過使用記憶體上限後自動重啟,那麼可以加上–max-memory-restart引數。(有對應的配置項)

pm2 start big-array.js –max-memory-restart 20M

更新pm2

pm2 save # 記得儲存程序狀態   
​  
pm2 save # 記得儲存程序狀態   ​  ​
 npm install pm2 -g 
​ 
​$ pm2 update 

pm2 + nginx

無非就是在nginx上做個反向代理配置,直接貼配置。

upstream my_nodejs_upstream { server 127.0.0.1:3001; 
} server { listen 80; server_name my_nodejs_server; root /home/www/project_root; location / { proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for; proxy_set_header Hostproxy_add_x_forwarded_for; proxy_set_header Hosthttp_host; proxy_set_header X-NginX-Proxy true; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “upgrade”; proxy_max_temp_file_size 0; proxy_pass http://my_nodejs_upstream/; proxy_redirect off; proxy_read_timeout 240s; 

}

pm2支援第三方擴充套件,比如常用的log rotate等。可參考官方文件。 
​ 
​ 
​ 
​ 
二、安裝

cd oneinstack/src
wget https://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-x64.tar.gz
tar xzf node-v4.2.4-linux-x64.tar.gz
cp node-v4.2.4-linux-x64/bin/node /usr/local/bin/
cp -R node-v4.2.4-linux-x64/lib/node_modules /usr/local/lib/
ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm
npm install pm2@latest -g #安裝最新版本pm2模組
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

PS: 如果你的主機無法連線公網,先找到能連公網的主機安裝上面的方法安裝pm2,然後拷貝到你要安裝的主機。拷貝如下目錄:

/usr/local/bin/node
/usr/local/lib/node_modules
  • 1
  • 2
  • 3

再建立相關軟連線 
三、PM2常用命令

假設你現在已經寫好了一個app.js的檔案,需要啟動,你可以使用pm2進行管理

1. 啟動

    # pm2 start app.js
    # pm2 start app.js --name my-api   #my-api為PM2程序名稱
    # pm2 start app.js -i 0           #根據CPU核數啟動程序個數
    # pm2 start app.js --watch   #實時監控app.js的方式啟動,當app.js檔案有變動時,pm2會自動reload

2. 檢視程序

    # pm2 list
    # pm2 show 0 或者 # pm2 info 0  #檢視程序詳細資訊,0為PM2程序id

3. 監控

    # pm2 monit

4. 停止

    # pm2 stop all  #停止PM2列表中所有的程序
    # pm2 stop 0    #停止PM2列表中程序為0的程序

5. 過載

    # pm2 reload all    #過載PM2列表中所有的程序
    # pm2 reload 0     #過載PM2列表中程序為0的程序

6. 重啟

    # pm2 restart all     #重啟PM2列表中所有的程序
    # pm2 restart 0      #重啟PM2列表中程序為0的程序

7. 刪除PM2程序

    # pm2 delete 0     #刪除PM2列表中程序為0的程序
    # pm2 delete all   #刪除PM2列表中所有的程序

8. 日誌操作

    # pm2 logs [--raw]   #Display all processes logs in streaming
    # pm2 flush              #Empty all log file
    # pm2 reloadLogs    #Reload all logs

9. 升級PM2

    # npm install pm2@lastest -g   #安裝最新的PM2版本
    # pm2 updatePM2                    #升級pm2

10. 更多命令引數請檢視幫助

    # pm2 --help
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

四、PM2目錄結構

預設的目錄是:當前用於的家目錄下的.pm2目錄(此目錄可以自定義,請參考:五、自定義啟動檔案),詳細資訊如下:

$HOME/.pm2                   #will contain all PM2 related files
$HOME/.pm2/logs           #will contain all applications logs
$HOME/.pm2/pids           #will contain all applications pids
$HOME/.pm2/pm2.log    #PM2 logs
$HOME/.pm2/pm2.pid    #PM2 pid
$HOME/.pm2/rpc.sock    #Socket file for remote commands
$HOME/.pm2/pub.sock   #Socket file for publishable events
$HOME/.pm2/conf.js       #PM2 Configuration
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

五、自定義啟動檔案

建立一個test.json的示例檔案,格式如下:

{
  "apps":
    {
      "name": "test",
      "cwd": "/data/wwwroot/nodejs",
      "script": "./test.sh",
      "exec_interpreter": "bash",
      "min_uptime": "60s",
      "max_restarts": 30,
      "exec_mode" : "cluster_mode",
      "error_file" : "./test-err.log",
      "out_file": "./test-out.log",
      "pid_file": "./test.pid"
      "watch": false
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

說明:

apps:json結構,apps是一個數組,每一個數組成員就是對應一個pm2中執行的應用

name:應用程式的名稱

cwd:應用程式所在的目錄

script:應用程式的指令碼路徑

exec_interpreter:應用程式的指令碼型別,這裡使用的shell,預設是nodejs

min_uptime:最小執行時間,這裡設定的是60s即如果應用程式在60s內退出,pm2會認為程式異常退出,此時觸發重啟max_restarts設定數量

max_restarts:設定應用程式異常退出重啟的次數,預設15次(從0開始計數)

exec_mode:應用程式啟動模式,這裡設定的是cluster_mode(叢集),預設是fork

error_file:自定義應用程式的錯誤日誌檔案

out_file:自定義應用程式日誌檔案

pid_file:自定義應用程式的pid檔案

watch:是否啟用監控模式,預設是false。如果設定成true,當應用程式變動時,pm2會自動過載。這裡也可以設定你要監控的檔案。

詳細引數列表:見附件八 
六、例項

已上面的test.json為例

# cat > /data/wwwroot/nodejs/test.sh << EOF
#!/bin/bash
while :
do
    echo "Test" >> 1.log
    sleep 5
done
EOF

# chmod +x test.sh      #新增執行許可權
# pm2 start test.json    #啟動,如下圖:

# pm2 list    #檢視pm2程序,如下圖: