pm2常用命令大全


原文地址: https://www.cnblogs.com/yalong/p/13931999.html

背景:

  如果一個網站的服務,必須通過命令行 node server.js 來啟動,啟動后,退出命令行服務就終止,這顯然不符合我們的預期。而即便是服務能持續運行,一旦遇到異常情況服務即終止,也是不理想的,這時候就需要有一種能夠守護進程的工具或者服務,來把已經掛起的服務再次重啟,這就是服務常駐的基本需求了。

對於 Node.js 來說,有很多工具可以幫我們做到這一點,PM2 就是其中一個。

PM2簡介:

PM2是一個守護進程管理器,它將幫助您管理和保持應用程序在線。

PM2官網地址: https://pm2.keymetrics.io/docs/usage/quick-start/

PM2的優點:

  1. 支持進程行為配置 ,即可以通過配置,實現對pm2管理應用的一些基礎屬性更新修改,如應用名稱,啟動模式等;

  2. 支持集群模式,支持負載均衡,但因采用nodejs的cluster模塊實現,僅適用於nodejs進程;

  3. 支持source map,此項針對js, source map文件是js源文件的信息文件,里面存儲着源文件的位置信息;

  4. 支持熱重啟;

  5. 支持部署工作流,pm2可依據測試環境和線上環境自動部署到不同的服務器,同時運行在不同配置下;

  6. 支持監聽重啟,在文件更新等情況下可實現進程自動重啟;

  7. 日志管理,兩種日志,pm2系統日志與管理的進程日志,默認會把進程的控制台輸出記錄到日志中;

  8. 監控功能,pm2 monit監控cpu和memory使用情況,keymetrics監控更為詳細;

  9. 支持pm2模塊開發,實現pm2的功能擴展, 比如美團團隊開發的pm2.5

  10. 最大內存重啟,設置最大內存限制,超過限制自動重啟;

PM2常用命令:

  1. pm2 start <script_file|config_file> [options] 啟動指定應用,如pm2 start index.js --name httpServer;

  2. pm2 stop <appName> [options] 停止指定應用,如pm2 stop httpServer;

  3. pm2 list  把所有pm2啟動實例列舉出來,注意:pm2 stop 某個項目后,該項目還會存在pm2 list 的列表里面, 只是狀態是 stop, 要想去掉該項目,用pm2 delete
  4. pm2 reload|restart <appName> [options]  重啟指定應用,如pm2 restart httpServer;

  5. pm2 show <appName> [options] 顯示指定應用詳情,如pm2 show httpServer;

  6. pm2 delete <appName> [options] 刪除指定應用,如pm2 delete httpServer,如果修改應用配置行為,最好先刪除應用后,重新啟動方才生效,如修改腳本入口文件;

  7. pm2 kill 殺掉pm2管理的所有進程;

  8. pm2 logs <appName>  查看指定應用的日志,即標准輸出和標准錯誤;

  9. pm2 monit 監控各個應用進程cpu和memory使用情況;

  10. pm2 startOrReload <appName> 如果項目沒有啟動就執行 start  如果項目正在運行 就執行relaod

提示 除了使用 appName 之外, 還可以使用 all: 全部程序     id: 該程序的 id

PM2配置方式:

1.CLI方式(命令行方式)

下面是使用命令行方式啟動的示例

pm2 start pm2.json --name appName 
--watch true--max-memory-restart 500M 

啟動可以附加的參數包括不限於下面這些:

--script   啟動腳本路徑 
--instances應用啟動實例個數,僅在cluster模式有效,默認為fork;
--exec_mode應用啟動模式,支持fork和cluster模式;
--name     指定 app 名字
--watch    監聽重啟,啟用情況下,文件夾或子文件夾下變化應用自動重啟
--ignore_watch  忽略監聽的文件夾,支持正則表達式,配合 watch 使用
--max-memory-restart  最大內存限制數,超出自動重啟;
--env      環境變量,object類型,如{"NODE_ENV":"production", "ID": "42"};
--log      指定 log 的位置, 若要指定新位置,需將原本的 process 刪掉,再重新啟動即可
--output   指定 output log 位址
--error    指定 error log 位址
--log-date-format     指定日志日期格式,如YYYY-MM-DD HH:mm:ss;
--arg1 --arg2 --arg3  額外的參數
--restart-delay   自動重啟時,要 delay 多久
--autorestart     默認為true, 發生異常的情況下自動重啟
--cron_restart    crontab時間格式重啟應用,目前只支持cluster模式;
--restart_delay   異常重啟情況下,延時重啟時間;

2.配置文件方式

可以是 json文件 比如名字叫做 pm2.json 如下 (注意 json里面是不能有注釋的,我下面是為了方便解釋說明):

{
  "apps": [{
    "name": "shark-pro",
    "script": "server/www.js",
    "cwd": "",
    "exec_mode": "cluster",
    "instances": 0,
    "max_memory_restart": "1G",
    "autorestart": true,
    "node_args": [],
    "args": [],
    "env": {
      "NODE_ENV": "production"
    }
  }],
  "deploy": {
    "production": {
      "user": "root",
      // 支持多個 host 部署
      "host": ["host1", "host2"],
      // 要部署的分支
      "ref": "origin/master",
      // Git 倉庫地址
      "repo": "git@gitlab.com:user/yourProject.git",
      // 要部署到 server 上的文件路徑
      "path": "/var/www/yourProjectName",
      // 如果 ssh 有設定好,從 local 連接到 remote 端將不會再詢問是否將 remote 端的 public key 加到 known host
      "ssh_options": "StrictHostKeyChecking=no",
      // 在 pm2 要從 local 端連到 remote 端之前要執行的指令,可以多個指令,由 ; 分割,也可以指定 shell script 的路徑
      "pre-setup": "apt update -y; apt install git -y",
      // 當 pm2 在 remote 機器上把代碼 clone 下來之后會執行的指令,同上,可以多個指令,由 ; 分割,也可以指定 shell script 的路徑
      "post-setup": "ls -la",
      // 當 pm2 在 local 要連上 remote 部署之前 ,在 local 端所要執行的指令, 同上,可以多個指令,由 ; 分割,也可以指定 shell script 路徑
      "pre-deploy-local" : "echo 'This is a local executed command'",
      // 部署完成后, 所要執行的指令 同上,可以多個指令,由 ; 分割,也可以指定 shell script 的路徑
      "post-deploy": "npm i && pm2 startOrRestart pm2.json --env production",
      "env_production": {
          "NODE_ENV": "production"
      }
    }
  }
}

也可以是 .yaml文件  比如名字叫 ecosystem.yaml 文件, 如下:

apps:
  - script: server/www.js
    name:  myApp
    env:
      COMMON_VARIABLE: true
    env_production:
      NODE_ENV: production
deploy:
  production:
    user: root
    host:
      - 12.12.12.12
    port: '12'
    ref: origin/master
    repo: git@github.com:xxxxxxx.git
    path: /root/www/deploy/production
    ssh_options: StrictHostKeyChecking=no
    pre-deploy: git fetch --all
    post-deploy: 'npm i && pm2 startOrRestart ecosystem.yaml --env production'
    env:
      NODE_ENV: production

常見問題:

如下是執行  pm2 list  把運行的項目羅列出來

 

 status就是pm2 的啟動模式, pm2 有兩種啟動模式 fork  cluster

1. fork 與 cluster 啟動模式

fork模式,單實例多進程,常用於多語言混編,比如php、python等,不支持端口復用,需要自己做應用的端口分配和負載均衡的子進程業務代碼。
缺點就是單服務器實例容易由於異常會導致服務器實例崩潰。

cluster模式,多實例多進程,但是只支持node,端口可以復用,不需要額外的端口配置,0代碼實現負載均衡。
優點就是由於多實例機制,可以保證服務器的容錯性,就算出現異常也不會使多個服務器實例同時崩潰。

2. reload 與 restart 區別

restart 是殺死並重新啟動進程。

reload 與 restart相反,reload實現0秒的停機重新加載

也就說說 使用reload,pm2逐個重新啟動所有進程,始終保持至少一個進程運行。
如果 reload 重新加載系統沒有成功地重新加載應用程序,則超時將回退到經典的重新啟動即 restart。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM