pm2 重启策略
早上小程序收到一个用户发过来的消息,说,小程序用不了了,一开始还以为是我弄的操作复杂了点,后面才发现是服务器的接口挂了,导致没数据请求回来,然后服务端接口用的是pm2,忘记输出错误日志,就把错误日志加上及增加下pm2的自动重启。
(大部分官方文档搬运过来)
重启策略
使用 PM2 启动应用程序时,应用程序会在自动退出、事件循环为空 (node.js) 或应用程序崩溃时自动重启。但您也可以配置额外的重启策略,例如:
- 在指定的 CRON 时间重启应用程序
- 文件更改后重启应用程序
- 当应用程序达到内存阈值时重启
- 延迟启动和自动重启
- 默认情况下,在崩溃或退出时禁用自动重启(应用程序始终使用 PM2 重启)
- 在特定的指数增长时间自动重启应用程序
1、定时重启
通过命令行:
$ pm2 start app.js --cron-restart="0 0 * * *"
# Or when restarting an app
$ pm2 restart app --cron-restart="0 0 * * *"
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
0 */2 * * * /sbin/service httpd restart 意思是每两个小时重启一次apache
50 7 * * * /sbin/service sshd start 意思是每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop 意思是每天22:50关闭ssh服务
0 0 1,15 * * fsck /home 每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup 每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; 每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令
配置文件的话使用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'
}
}]
}
2、文件更改时重启
当当前目录或其子目录中的文件被修改时,PM2 可以自动重启您的应用程序:
通过命令行:
$ 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"],
}
3、基于内存的重启策略
PM2 允许基于内存限制重新加载(如果不在集群中自动回退重启)应用程序,请注意 PM2 内部工作过程(检查内存)每 30 秒启动一次,因此您可能需要稍等片刻达到内存阈值后,进程会自动重启。
命令行界面:
$ pm2 start api.js --max-memory-restart 300M
可在配置文件中使用max_memory_restart属性:
module.exports = {
script: 'api.js',
max_memory_restart: '300M'
}
注意:单位可以是 K(ilobyte) (eg 512K)、M(egabyte) (eg 128M)、G(igabyte) (eg 1G)。
4、延迟重启
使用 Restart Delay 策略设置自动重启之间的延迟:
命令行界面:
$ pm2 start app.js --restart-delay=3000
可在配置文件中使用restart_delay属性:
module.exports = {
script: 'app.js',
restart_delay: 3000
}
5、不自动重启
如果我们希望只运行 1 次脚本并且不希望进程管理器在脚本完成运行时重启我们的脚本。
命令行界面:
$ pm2 start app.js --no-autorestart
可在配置文件中使用autorestart属性:
module.exports = {
script: 'app.js',
autorestart: false
}
6、跳过特定退出代码的自动重启
有时您可能希望应用程序在出现故障时自动重启(即非零退出代码),而不希望进程管理器在其正常关闭时重启它(即退出代码等于 0)。
在这种情况下,您仍然可以很好地使用 PM2,并将stop_exit_codes选项设置为退出应跳过自动重启的代码:
命令行界面:
$ pm2 start app.js --stop-exit-codes 0
或者在配置文件中使用stop_exit_codes属性:
module.exports = [{
script: 'app.js',
stop_exit_codes: [0]
}]
7、指数退避延迟重启
在 PM2 Runtime 上实施了新的重启模式,使您的应用程序以更智能的方式重启。当异常发生(例如数据库关闭)时,指数退避重启将增加重启之间的时间,减少您的数据库或外部供应商的压力,不是疯狂地重新启动应用程序:
命令行界面:
$ 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 毫秒。