pm2 重启策略(restart strategies)
使用 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 教程
pm2 重启策略(restart strategies)的更多相关文章
- (转)Docker容器的重启策略及docker run的--restart选项详解
1. Docker容器的重启策略 Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略. Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关. ...
- Docker容器的重启策略及docker run的--restart选项详解
https://blog.csdn.net/taiyangdao/article/details/73076019 1. Docker容器的重启策略 Docker容器的重启策略是面向生产环境的一个启动 ...
- [erlang]supervisor(监控树)的重启策略
1. init函数 init() -> {ok, {SupFlags, [ChildSpec,...]}} | ignore. [ChildSpec,...] 是在init之后默认要启动的子进程 ...
- Flink重启策略
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...
- Docker Kubernetes 容器重启策略
Docker Kubernetes 容器重启策略 当容器被创建时,容器会根据重启策略来进行容器重启. 支持三种策略: Always:当容器终止退出后,总是重启容器,默认策略. OnFailure:当容 ...
- .net core i上 K8S(四).netcore程序的pod管理,重启策略与健康检查
上一章我们已经通过yaml文件将.netcore程序跑起来了,但还有一下细节问题可以分享给大家. 1.pod管理 1.1创建pod kubectl create -f netcore-pod.yaml ...
- docker 容器重启策略
查看docker 容器重启策略 docker inspect 容器ID docker run -d --restart=always bba-208 docker run -d --restart=o ...
- OpenGL ES 3.0: 图元重启(Primitive restart)
[TOC] 背景概述 在OpenGL绘制图形时,可能需要绘制多个并不相连的图形.这样的情况下这几个图形没法被当做一个图形来处理.也就需要多次调用 DrawArrays 或 DrawElements. ...
- Tomcat重启脚本restart.sh停止脚本stop.sh
Tomcat重启脚本restart.sh停止脚本stop.sh Tomcat本身提供了 startup.sh(启动)shutdown.sh(关闭)脚本,我们在部署中经常会出现死进程形象,无法杀掉进程需 ...
随机推荐
- ORA-19815: WARNING: db_recovery_file_dest_size闪回区爆满问题处理
问题描述:有一个数据库起不来了,根据层层排查,是因为归档设置在了闪回区,文件的大小已经超出了闪回区限制.最后直接给数据库拖挂 环境:windows server2012 , oracle 19c,单机 ...
- 【UE4】GAMES101 图形学作业2:光栅化和深度缓存
总览 在上次作业中,虽然我们在屏幕上画出一个线框三角形,但这看起来并不是那么的有趣.所以这一次我们继续推进一步--在屏幕上画出一个实心三角形,换言之,栅格化一个三角形.上一次作业中,在视口变化之后,我 ...
- 第1次 Beta Scrum Meeting
本次会议为Beta阶段第1次Scrum Meeting会议 会议概要 会议时间:2021年5月29日 会议地点:「腾讯会议」线上进行 会议时长:0.5小时 会议内容简介:本次会议为Beta阶段第1次会 ...
- js基础学习之"=="与"==="的区别
var a = 1; var b = 1; var c = "1"; 1. "==" 可理解为相等运算符.相等运算符比较时,会自己进行类型转换,等于什么类型就会 ...
- 2021.1.8 NKOJ 周赛总结
意料之中..... A:nkoj 3900 AC小程序 http://oi.nks.edu.cn/zh/Problem/Details/3900 A题比较简单,单独分析一下A和C,其实就是一个斐波那契 ...
- stm32驱动超声波模块
下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发. #define HCSR04_PORT GPIOB #define HCSR04_CLK RCC ...
- python 3 range函数类型
在python3中 print(range(10))range(0,10) 得出的结果是 range(0,10) ,而不是[0,1,2,3,4,5,6,7,8,9] ,为什么呢?而且原来Python2 ...
- configure: error: C preprocessor "arm-linux-gnueabihf-g++" fails sanity check
今天在交叉编译某个编解码库过程中碰到一个configure错误 运行configure的时候设置了一些配置项目 ./configure CC=arm-linux-gnueabihf-gcc CPP=a ...
- 矩形覆盖 牛客网 剑指Offer
矩形覆盖 牛客网 剑指Offer 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution: ...
- Linux Kernel 記憶體管理機制之美<转>
转自--http://five.rdaili.com/sohu.com.php?u=Mq3EniVnae0axim7jkGhH0IhA9uho6CQso7R1aYomXWJ9UemfwUQYmKRc8 ...