重新啟動策略

重新啟動策略

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

  • 在指定的 CRON 時間重新啟動應用程式
  • 在檔案變更時重新啟動應用程式
  • 在應用程式達到記憶體臨界值時重新啟動
  • 延遲啟動和自動重新啟動
  • 停用自動重新啟動 (應用程式在預設情況下會在崩潰或退出時使用 PM2 重新啟動)
  • 在特定的指數增加時間自動重新啟動應用程式

在 cron 時間重新啟動

透過 CLI

$ pm2 start app.js --cron-restart="0 0 * * *"
# Or when restarting an app
$ pm2 restart app --cron-restart="0 0 * * *"

透過組態檔,使用 cron_restart 屬性

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

停用 cron 重新啟動

pm2 restart app --cron-restart 0

在檔案變更時重新啟動

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

透過 CLI

$ pm2 start app.js --watch

注意:如果使用 --watch 選項啟動應用程式,停止應用程式不會阻止它在檔案變更時重新啟動。若要完全停用監控功能,請執行:pm2 stop app --watch 或透過 pm2 restart app --watch 在應用程式重新啟動時切換監控選項。

透過組態檔,使用 watch: true 屬性

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

您可以使用這些選項指定要監控變更的資料夾、忽略的資料夾和監控檔案間隔

module.exports = {
  script: "app.js",
  // Specify which folder to watch
  watch: ["server", "client"],
  // Specify delay between watch interval
  watch_delay: 1000,
  // Specify which folder to ignore 
  ignore_watch : ["node_modules", "client/img"],
}

基於記憶體的重新啟動策略

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

CLI

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

透過組態檔,使用 max_memory_restart 屬性

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

注意:單位可以是 K(千位元組)(例如 512K)、M(百萬位元組)(例如 128M)、G(十億位元組)(例如 1G)。

重新啟動延遲

使用重新啟動延遲策略設定自動重新啟動之間的延遲

CLI

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

透過組態檔,使用 restart_delay 屬性

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

不自動重新啟動

這在我們希望執行一次性腳本,且不希望處理程序管理員在腳本執行完畢後重新啟動腳本時很有用。

CLI

$ pm2 start app.js --no-autorestart

透過組態檔,使用 autorestart 屬性

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

針對特定結束代碼略過自動重新啟動

有時您可能希望應用程式在發生錯誤(即非零結束代碼)時自動重新啟動,同時不希望處理程序管理員在應用程式正常關閉時(即結束代碼等於 0)重新啟動它。

在這種情況下,您仍然可以使用 PM2,只要將 stop_exit_codes 選項設定為應略過自動重新啟動的結束代碼即可

CLI

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

或透過組態檔,使用 stop_exit_codes 屬性

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

指數遞減重新啟動延遲

已在 PM2 Runtime 中實作新的重新啟動模式,讓您的應用程式以更聰明的方式重新啟動。當發生例外狀況(例如資料庫故障)時,不再會瘋狂地重新啟動您的應用程式,指數遞減重新啟動 會逐步增加重新啟動之間的時間,減輕資料庫或外部提供者的負擔… 非常容易使用

CLI

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

透過組態檔,使用 exp_backoff_restart_delay 屬性

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

當應用程式意外崩潰且選項 --exp-backoff-restart-delay 已啟用時,您將可以看到新的應用程式狀態等待重新啟動

透過執行 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 毫秒。

協助編輯此頁面