pm2 重啟策略(restart strategies)

跡憶客發表於2021-11-29

使用 PM2 啟動應用程式 時,應用程式會在自動退出、事件迴圈為空 (node.js) 或應用程式崩潰時自動重新啟動。 但您也可以配置額外的重啟策略,例如:

  • 使用定時任務重新啟動應用程式
  • 檔案更改後重新啟動應用程式
  • 當應用程式達到記憶體閾值時重新啟動
  • 延遲啟動和自動重啟
  • 預設情況下,在崩潰或退出時禁用自動重啟(應用程式始終使用 PM2 重啟)
  • 在特定的指數增長時間自動重啟應用程式

使用定時任務重新啟動應用程式

使用以下命令設定定時重啟的任務

$ pm2 start server.js --cron-restart="0 0 * * *" 
# 或者在重啟的時候設定定時任務 
$ pm2 restart app --cron-restart="0 0 * * *"

如果是通過配置檔案的話,使用 cron_restart 

server.config.js

module.exports = {
  apps : [{
    name: 'server',
    script: 'server.js',
    instances: 1,
    cron_restart: '0 0 * * *',
    env: {
      NODE_ENV: 'development'
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }]
}

 


檔案更改後自動重新啟動應用程式

當前目錄或其子目錄中的檔案被修改時,PM2 可以自動重新啟動您的應用程式:

使用以下命令,通過在後面指定選項 --watch 開啟應用程式

$ pm2 start server.js --watch

 

下面我們通過gif動圖演示該情況

 

注意:如果應用程式使用 --watch 選項啟動,停止應用程式不會阻止它在檔案更改時重新啟動。 要完全禁用 watch 功能,需要執行下面的命令:

$ pm2 stop app --watch 

 

或者使用下面命令在應用程式重新啟動時切換 watch 選項。

$ pm2 restart app --watch 

 

在配置檔案中,使用 watch: true 屬性

module.exports = {
  script: "server.js",
  watch: true
}

 

我們還可以在配置檔案中指定要監聽哪個資料夾,當其內容有修改的時候自動重啟應用程式。還可以指定忽略某些資料夾,不管其內容如何改變都不會觸發重啟

module.exports = {
  script: "server.js",
  // 指定監聽的資料夾
  watch: ["server", "client"],
  // 指定延遲時間
  watch_delay: 1000,
  // 指定要忽略的資料夾
  ignore_watch : ["node_modules", "client/img"],
}

 


當應用程式達到記憶體閾值時重新啟動

PM2 允許根據記憶體限制重新載入(如果不在叢集中,則自動回退重啟)應用程式/請注意 PM2 內部工作程式(檢查記憶體)每 30 秒啟動一次,因此達到記憶體閾值後,可能需要稍等片刻 程式會自動重新啟動。

使用  --max-memory-restart 選項指定記憶體閾值。

$ pm2 start server.js --max-memory-restart 300M

 

配置檔案中使用 max_memory_restart 屬性。

server.config.js

module.exports = {
  script: 'server.js',
  max_memory_restart: '300M'
}

 

注意:單位可以是 K(ilobyte)(例如 512K)、M(egabyte)(例如 128M)、G(igabyte)(例如 1G)。


延時重啟

使用 Restart Delay 策略設定自動重啟之間的延遲:

$ pm2 start server.js --restart-delay=3000

 

在配置檔案中,使用 restart_delay 屬性設定延時重啟。

server.config.js

module.exports = {
  script: 'server.js',
  restart_delay: 3000
}

 


禁止自動重啟

如果我們希望執行 1 次指令碼並且不希望程式管理器在指令碼完成執行時重新啟動我們的指令碼,這將非常有用。

$ pm2 start server.js --no-autorestart

 

在配置檔案中,使用 autorestart: false 屬性禁止自動重啟。

server.config.js

module.exports = {
  script: 'server.js',
  autorestart: false
}

 


指定不自動重啟的退出程式碼

有時我們可能希望應用程式在出現故障時自動重新啟動(即非零退出程式碼),而不希望程式管理器在正確關閉時重新啟動它(即退出程式碼等於 0)。

在這種情況下,仍然可以很好地使用 PM2,並將 stop_exit_codes 選項設定為應該跳過自動重啟的退出程式碼:

$ pm2 start server.js --stop-exit-codes 0

 

在配置檔案中,使用 stop_exit_codes 屬性設定不用自動重啟的退出程式碼。

server.config.js

module.exports = [{
  script: 'server.js',
  stop_exit_codes: [0]
}]

 


指數退避重啟延遲

在 PM2 Runtime 上實施了新的重啟模式,使我們的應用程式以更智慧的方式重啟。 當異常發生(例如資料庫關閉)時,不是瘋狂地重新啟動應用程式,指數退避重新啟動將增加重新啟動之間的時間,減少我們的資料庫或外部提供程式的壓力......非常易於使用:

在終端命令列使用選項 --exp-backoff-restart-delay 設定此功能

$ pm2 start app.js --exp-backoff-restart-delay=100

 

在配置檔案中,使用 exp_backoff_restart_delay 屬性。

server.config.js

module.exports = {
  script: 'server.js',
  exp_backoff_restart_delay: 100
}

 

當應用程式意外崩潰並啟用選項 --exp-backoff-restart-delay 時,我們將能夠看到新的應用程式狀態 waiting restart

通過執行  pm2 logs ,我們還將看到重新啟動延遲增加:

PM2      | App [throw:0] will restart in 100ms
PM2      | App [throw:0] exited with code [1] via signal [SIGINT]
PM2      | App [throw:0] will restart in 150ms
PM2      | App [throw:0] exited with code [1] via signal [SIGINT]
PM2      | App [throw:0] will restart in 225ms

如你所見,重啟之間的重啟延遲將以指數移動平均線增加,直到達到重啟之間的最大值 15000 毫秒。

當應用程式返回到穩定模式(正常執行時間不超過 30 秒)時,重啟延遲將自動重置為 0 毫秒。

 

更多關於pm2的介紹,參考 pm2 教程

相關文章