Node.js进程退出的多种原因有哪些?
- 内容介绍
- 相关推荐
本文共计1859个文字,预计阅读时间需要8分钟。
本篇文章探讨Node.js进程退出的原因及处理方法,希望对大家有所帮助!
在Node.js服务发布后,难免会遇到进程退出的问题。以下是一些可能导致Node.js进程退出的情况:
1. 代码错误:如语法错误、逻辑错误等。
2.资源耗尽:如内存溢出、文件描述符耗尽等。
3.外部因素:如网络中断、系统故障等。
为了避免进程退出,以下是一些建议:
1. 代码审查:确保代码质量,避免潜在的错误。
2.资源监控:监控内存、文件描述符等资源使用情况,及时处理异常。
3.异常处理:在代码中添加异常处理机制,捕获并处理可能导致的进程退出。
此外,在服务发布后,确保运行环境稳定也非常重要。以下是一些建议:
1. 容器化:使用Docker等容器技术,确保服务在一致的环境中运行。
2.进程管理:使用pm2等进程管理工具,实现服务的自动重启、负载均衡等功能。
总之,Node.js进程退出是一个常见问题,但通过合理的方法和工具,可以有效避免和解决。希望本文对大家有所帮助!
本篇文章聊聊Node的进程退出,介绍各种可能导致 Node.js 进程退出的情况,希望对大家有所帮助!在我们的服务发布后,难免会被运行环境(如容器、pm2 等)调度、升级服务导致重启、各种异常导致进程崩溃;一般情况下,运行环境都有对服务进程的健康监测,在进程异常时,会重新拉起进程,在升级时,也有滚动升级的策略。但运行环境的调度策略是把我们服务的进程当成黑盒来处理的,不会管服务进程内部的运行情况,因此需要我们的服务进程主动感知运行环境的调度动作,然后做一些退出的清理动作。
因此我们今天就是梳理各种可能导致 Node.js 进程退出的情况,以及我们可以通过监听这些进程退出事件做哪些事情。
原理
一个进程要退出,无非就是两种情况,一是进程自己主动退出,另外就是收到系统信号,要求进程退出。
系统信号通知退出
在 Node.js 官方文档 中列出了常见的系统信号,我们主要关注几个:
- SIGHUP:不通过 ctrl+c 停止进程,而是直接关闭命令行终端,会触发该信号
- SIGINT:按下 ctrl+c 停止进程时触发;pm2 重启或者停止子进程时,也会向子进程发送该信号
- SIGTERM:一般用于通知进程优雅退出,如 k8s 删除 pod 时,就会向 pod 发送 SIGTERM 信号,pod 可以在超时时间内(默认 30s)做一些退出清理动作
- SIGBREAK:在 window 系统上,按下 ctrl+break 会触发该信号
- SIGKILL:强制退出进程,进程无法做任何清理动作,执行命令 kill -9 pid,进程会收到该信号。k8s 删除 pod 时,如果超过 30s,pod 还没退出,k8s 会向 pod 发送 SIGKILL 信号,立即退出 pod 进程;pm2 在重启或者停止进程时,如果超过 1.6s,进程还没退出,也会发送 SIGKILL 信号
在收到非强制退出信号时,Node.js 进程可以监听退出信号,做一些自定义的退出逻辑。比如我们写了一个 cli 工具,需要比较长的时间执行任务,如果用户在任务执行完成前想要通过 ctrl+c 退出进程时,可以提示用户再等等:
const readline = require('readline'); process.on('SIGINT', () => { // 我们通过 readline 来简单地实现命令行里面的交互 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('任务还没执行完,确定要退出吗?', answer => { if (answer === 'yes') { console.log('任务执行中断,退出进程'); process.exit(0); } else { console.log('任务继续执行...'); } rl.close(); }); }); // 模拟一个需要执行 1 分钟的任务 const longTimeTask = () => { console.log('task start...'); setTimeout(() => { console.log('task end'); }, 1000 * 60); }; longTimeTask();
实现效果如下,每次按下 ctrl + c 都会提示用户:
进程主动退出
Node.js 进程主动退出,主要包含下面几种情况:
- 代码执行过程中触发了未捕获的错误,可以通过 process.on('uncaughtException') 监听这种情况
- 代码执行过程中触发了未处理的 promise rejection(Node.js v16 开始会导致进程退出),可以通过 process.on('unhandledRejection') 监听这种情况
- EventEmitter 触发了未监听的 error 事件
- 代码中主动调用 process.exit 函数退出进程,可以通过 process.on('exit') 监听
- Node.js 的事件队列为空,可简单认为没有需要执行的代码了,可以通过 process.on('exit') 监听
我们知道 pm2 有守护进程的效果,在你的进程发生错误退出时,pm2 会重启你的进程,我们也在 Node.js 的 cluster 模式下,实现一个守护子进程的效果(实际上 pm2 也是类似的逻辑):
const cluster = require('cluster'); const github.com/darukjs/daruk-exit-hook
进程优雅退出
通常我们的 web server 在重启、被运行容器调度(pm2 或者 docker 等)、出现异常导致进程退出时,我们希望执行退出动作,如完成已经连接到服务的请求响应、清理数据库连接、打印错误日志、触发告警等,做完退出动作后,再退出进程,我们可以使用刚才的进程退出监听工具实现:
const github.com/sebhildebrandt/http-graceful-shutdown setTimout(callback, 5 * 1000) })
总结
通过上面的文字,相信你已经对导致 Node.js 进程退出的各种情况心里有数了。在服务上线后,虽然 k8s、pm2 等工具能够在进程异常退出时,不停地拉起进程,保证服务的可用性,但我们也应该在代码中主动感知进程的异常或者被调度的情况,从而能够更早发现问题。
更多node相关知识,请访问:nodejs 教程!
以上就是聊聊各种可能导致 Node.js 进程退出的情况的详细内容,更多请关注自由互联其它相关文章!
本文共计1859个文字,预计阅读时间需要8分钟。
本篇文章探讨Node.js进程退出的原因及处理方法,希望对大家有所帮助!
在Node.js服务发布后,难免会遇到进程退出的问题。以下是一些可能导致Node.js进程退出的情况:
1. 代码错误:如语法错误、逻辑错误等。
2.资源耗尽:如内存溢出、文件描述符耗尽等。
3.外部因素:如网络中断、系统故障等。
为了避免进程退出,以下是一些建议:
1. 代码审查:确保代码质量,避免潜在的错误。
2.资源监控:监控内存、文件描述符等资源使用情况,及时处理异常。
3.异常处理:在代码中添加异常处理机制,捕获并处理可能导致的进程退出。
此外,在服务发布后,确保运行环境稳定也非常重要。以下是一些建议:
1. 容器化:使用Docker等容器技术,确保服务在一致的环境中运行。
2.进程管理:使用pm2等进程管理工具,实现服务的自动重启、负载均衡等功能。
总之,Node.js进程退出是一个常见问题,但通过合理的方法和工具,可以有效避免和解决。希望本文对大家有所帮助!
本篇文章聊聊Node的进程退出,介绍各种可能导致 Node.js 进程退出的情况,希望对大家有所帮助!在我们的服务发布后,难免会被运行环境(如容器、pm2 等)调度、升级服务导致重启、各种异常导致进程崩溃;一般情况下,运行环境都有对服务进程的健康监测,在进程异常时,会重新拉起进程,在升级时,也有滚动升级的策略。但运行环境的调度策略是把我们服务的进程当成黑盒来处理的,不会管服务进程内部的运行情况,因此需要我们的服务进程主动感知运行环境的调度动作,然后做一些退出的清理动作。
因此我们今天就是梳理各种可能导致 Node.js 进程退出的情况,以及我们可以通过监听这些进程退出事件做哪些事情。
原理
一个进程要退出,无非就是两种情况,一是进程自己主动退出,另外就是收到系统信号,要求进程退出。
系统信号通知退出
在 Node.js 官方文档 中列出了常见的系统信号,我们主要关注几个:
- SIGHUP:不通过 ctrl+c 停止进程,而是直接关闭命令行终端,会触发该信号
- SIGINT:按下 ctrl+c 停止进程时触发;pm2 重启或者停止子进程时,也会向子进程发送该信号
- SIGTERM:一般用于通知进程优雅退出,如 k8s 删除 pod 时,就会向 pod 发送 SIGTERM 信号,pod 可以在超时时间内(默认 30s)做一些退出清理动作
- SIGBREAK:在 window 系统上,按下 ctrl+break 会触发该信号
- SIGKILL:强制退出进程,进程无法做任何清理动作,执行命令 kill -9 pid,进程会收到该信号。k8s 删除 pod 时,如果超过 30s,pod 还没退出,k8s 会向 pod 发送 SIGKILL 信号,立即退出 pod 进程;pm2 在重启或者停止进程时,如果超过 1.6s,进程还没退出,也会发送 SIGKILL 信号
在收到非强制退出信号时,Node.js 进程可以监听退出信号,做一些自定义的退出逻辑。比如我们写了一个 cli 工具,需要比较长的时间执行任务,如果用户在任务执行完成前想要通过 ctrl+c 退出进程时,可以提示用户再等等:
const readline = require('readline'); process.on('SIGINT', () => { // 我们通过 readline 来简单地实现命令行里面的交互 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('任务还没执行完,确定要退出吗?', answer => { if (answer === 'yes') { console.log('任务执行中断,退出进程'); process.exit(0); } else { console.log('任务继续执行...'); } rl.close(); }); }); // 模拟一个需要执行 1 分钟的任务 const longTimeTask = () => { console.log('task start...'); setTimeout(() => { console.log('task end'); }, 1000 * 60); }; longTimeTask();
实现效果如下,每次按下 ctrl + c 都会提示用户:
进程主动退出
Node.js 进程主动退出,主要包含下面几种情况:
- 代码执行过程中触发了未捕获的错误,可以通过 process.on('uncaughtException') 监听这种情况
- 代码执行过程中触发了未处理的 promise rejection(Node.js v16 开始会导致进程退出),可以通过 process.on('unhandledRejection') 监听这种情况
- EventEmitter 触发了未监听的 error 事件
- 代码中主动调用 process.exit 函数退出进程,可以通过 process.on('exit') 监听
- Node.js 的事件队列为空,可简单认为没有需要执行的代码了,可以通过 process.on('exit') 监听
我们知道 pm2 有守护进程的效果,在你的进程发生错误退出时,pm2 会重启你的进程,我们也在 Node.js 的 cluster 模式下,实现一个守护子进程的效果(实际上 pm2 也是类似的逻辑):
const cluster = require('cluster'); const github.com/darukjs/daruk-exit-hook
进程优雅退出
通常我们的 web server 在重启、被运行容器调度(pm2 或者 docker 等)、出现异常导致进程退出时,我们希望执行退出动作,如完成已经连接到服务的请求响应、清理数据库连接、打印错误日志、触发告警等,做完退出动作后,再退出进程,我们可以使用刚才的进程退出监听工具实现:
const github.com/sebhildebrandt/http-graceful-shutdown setTimout(callback, 5 * 1000) })
总结
通过上面的文字,相信你已经对导致 Node.js 进程退出的各种情况心里有数了。在服务上线后,虽然 k8s、pm2 等工具能够在进程异常退出时,不停地拉起进程,保证服务的可用性,但我们也应该在代码中主动感知进程的异常或者被调度的情况,从而能够更早发现问题。
更多node相关知识,请访问:nodejs 教程!
以上就是聊聊各种可能导致 Node.js 进程退出的情况的详细内容,更多请关注自由互联其它相关文章!

