重新啟動策略
在使用 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 毫秒。
協助編輯此頁面