首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一个 Node 进程死亡与善后

一个 Node 进程,除了提供 HTTP 服务外,也绝少不了跑脚本身影。跑一个脚本拉取配置、处理数据以及定时任务更是家常便饭。...在一些重要流程能够看到脚本身影: CI,用以测试、质量保障及部署等 Cron,用以定时任务 Docker,用以构建镜像 如果在这些重要流程脚本出错无法及时发现问题,将有可能引发更加隐蔽问题。...以下示例监听到 SIGINT 与 SIGTERM 信号,SIGKILL 无法被监听,setTimeout 保证程序不会退出 console.log(`Pid: ${process.pid}`) process.on...Received: SIGTERM Received: SIGTERM Received: SIGINT Received: SIGINT Received: SIGINT 容器退出优雅处理...1,在 Node15 修复了这一个问题 Node 进程退出时需要优雅退出 k8s 关闭 POD 时先发一个 SIGTERM 信号,留 30s 时间处理未完成事,如若 POD 没有正常退出,30s 过后发送

1K20

Node.js 进程平滑离场剖析

使用 Node.js 搭建 HTTP Server 已是司空见惯事。在生产环境Node 进程平滑重启直接关系到服务可靠性,它重要性不容我们忽视。...这里只是顺便介绍一种,在知道监听 TCP 端口情况获取进程方式。 随后,我们发起一个请求,在收到响应之前(有 5 秒等待时间),我们给应用发送 SIGINT 信号。...也就是说,默认情况下,Node 应用在接收到 SIGINT 信号时,会马上把进程杀死,无视进程还没处理完成请求。...回到上面的问题,我们可以近似地理解为 Node 应用响应 SIGINT 事件默认回调是这样子process.on('SIGINT', () => { process.exit(128 + 2...如何让进程平滑离场 我们在上面示例基础上,也就是在文件 server.js ,补充如下代码: process.on('SIGINT', () => { server.close(err => {

2.7K100
您找到你想要的搜索结果了吗?
是的
没有找到

在 Docker 容器捕获信号

这些操作本质都是通过从主机向容器发送信号实现主机与容器中程序交互。比如我们可以向容器应用发送一个重新加载信号,容器应用程序在接到信号后执行相应处理程序完成重新加载配置文件任务。...下面的代码简单说明在 nodejs 如何为一个信号注册处理程序process.on('SIGTERM', function() {   console.log('shutting down......然后启动容器运行应用程序: $ docker run -it --rm -p 3000:3000 --name="my-app" signal-app 此时 node 应用在容器进程号为 1: 现在我们让程序退出...很显然这不是我们期望,我们希望程序能够收到 SIGTERM  信号优雅退出。 在脚本捕获信号 创建另外一个启动应用程序脚本文件 app2.sh,内容如下: #!...,但是它却可以接收到 SIGTERM 信号并优雅退出了: 结论 容器 1 号进程是非常重要,如果它不能正确处理相关信号,那么应用程序退出方式几乎总是被强制杀死而不是优雅退出

2.6K20

node创建服务进程

背景 在node工程部署,常常涉及到三方:本地客户端、跳板机和服务器(集群)。...在通过git触发gitlab hook脚本后,需要在跳板机执行相应ssh命令执行shell文件启动node服务器,这需要使用一个常用命令setsid,这样当ssh命令执行完毕shell退出后,node...之所以出现这种情况是由于node创建子进程时默认会通过pipe方式将子进程输出导流到父进程stream(childProcess.stdout、childProcess.stderr),提供在父进程输出子进程消息能力...因此,如果要让子进程在接收到SIGINT信号不退出,只需要不作处理即可: file: c.js process.on('SIGINT',function(){ console.log('child...,并关闭父进程继承打开fd 所谓会话和进程组,则是在linux多任务多用户下概念。

1.7K60

Node.js进阶之进程与线程

快速导航 进程 线程 Node.js 线程与进程 Node.js 进程创建 Node.js 多进程架构模型 守护进程编写 进程 进程(Process)是计算机程序关于某数据集合上一次运行活动,是系统进行资源分配和调度基本单位...,适合于 I/O 密集型应用场景,因为异步,程序无需阻塞等待结果返回,而是基于回调通知机制,原本同步模式等待时间,则可以用来处理其它任务,在 Web 服务器方面,著名 Nginx 也是采用此模式...由于单线程原故,一些复杂、消耗 CPU 资源任务建议不要交给 Node.js 来处理,当你业务需要一些大量计算、视频编码解码等 CPU 密集型任务,可以采用 C 语言。...方法,在进行 cpmpute 计算时创建子进程,子进程计算完成通过 send 方法将结果发送给主进程,主进程通过 message 监听到信息后处理并退出。...以上 Demo 简单介绍了多进程创建、异常监听、重启等,但是做为企业级应用程序我们还需要考虑更完善,例如:进程重启次数限制、与守护进程结合、多进程模式下定时任务处理等,感兴趣同学推荐看下阿里 Egg.js

1.1K21

Node.js 全局对象(下)

它用于描述当前Node.js 进程状态对象,提供了一个与操作系统简单接口。通常在你写本地命令行程序时候,少不了要 和它打交道。下面将会介绍 process 对象一些最常用成员方法。...通常来说,当没有进程安排时 node 退出,但是 'beforeExit' 监听器可以异步调用,这样 node 就会继续执行。...信号列表详见标准 POSIX 信号名,如 SIGINT、SIGUSR1 等。...main.js 文件,代码如下所示: $ node main.js 程序执行结束 退出码为: 0 退出状态码 退出状态码如下所示: 状态码 名称 & 描述 1 Uncaught Fatal Exception...主要用途是可以通过精确时间间隔,来衡量程序性能。你可以将之前结果传递给当前 process.hrtime() ,会返回两者间时间差,用来基准和测量时间间隔。

1.4K20

Docker 容器环境下 Node.js 应用程序优雅退出

—— 卡曾斯 Docker 容器环境下 Node.js 应用程序优雅退出,也就是在程序意外退出之后服务进程要接收到 SIGTERM 信号,待当前链接处理完成之后再退出,这样是比较优雅,但是在 Docker...编写一个简单 Node.js 应用程序实现优雅退出 Docker 容器环境下程序优雅退出测试 Docker 容器下应用无法接收退出信号原因分析 Docker 容器环境下构建平滑 Node.js 应用程序多种实现方案...,可以看到我请求得到了一个错误响应 kill -15:是发送一个 SIGTERM 信号,该信号可由应用程序捕获, 故使用 SIGTERM 也让程序有机会在退出之前做好清理工作, 从而优雅地终止。...我们程序默认是不会去监听这项工作,需要显示监听该信息,在资源释放完成之后执行 process.exit(0) 退出进程。...('SIGTERM', close.bind(this, 'SIGTERM')); process.on('SIGINT', close.bind(this, 'SIGINT')); function

1.8K00

Dcoker 容器环境下 Node.js 应用程序优雅退出

—— 卡曾斯 Dcoker 容器环境下 Node.js 应用程序优雅退出,也就是在程序意外退出之后服务进程要接收到 SIGTERM 信号,待当前链接处理完成之后再退出,这样是比较优雅,但是在 Docker...编写一个简单 Node.js 应用程序实现优雅退出 Docker 容器环境下程序优雅退出测试 Dcoker 容器下应用无法接收退出信号原因分析 Dcoker 容器环境下构建平滑 Node.js 应用程序多种实现方案...,可以看到我请求得到了一个错误响应 kill -15:是发送一个 SIGTERM 信号,该信号可由应用程序捕获, 故使用 SIGTERM 也让程序有机会在退出之前做好清理工作, 从而优雅地终止。...我们程序默认是不会去监听这项工作,需要显示监听该信息,在资源释放完成之后执行 process.exit(0) 退出进程。...('SIGTERM', close.bind(this, 'SIGTERM')); process.on('SIGINT', close.bind(this, 'SIGINT')); function

1.2K10

深入理解Node.js 进程与线程(8000长文彻底搞懂)

Node.js 开发过程,错误会引起整个应用退出,应用健壮性值得考验,尤其是错误异常抛出,以及进程守护是必须要做。...进行多任务执行,适合于 I/O 密集型应用场景,因为异步,程序无需阻塞等待结果返回,而是基于回调通知机制,原本同步模式等待时间,则可以用来处理其它任务, 科普:在 Web 服务器方面,著名...子进程在启动过程,根据文件描述符去连接这个已存在IPC通道,从而完成父子进程之间连接。...Node.js句柄传递 讲句柄之前,先想一个问题,send句柄发送时候,真的是将服务器对象发送给了子进程?...pm2 reloadNamepm2 restartName 应用程序代码有更新,可以用重载来加载新代码,也可以用重启来完成,reload可以做到0秒宕机加载新代码,restart则是重新启动,生产环境多用

1K30

深入理解Node.js 进程与线程(8000长文彻底搞懂)

Node.js 开发过程,错误会引起整个应用退出,应用健壮性值得考验,尤其是错误异常抛出,以及进程守护是必须要做。...进行多任务执行,适合于 I/O 密集型应用场景,因为异步,程序无需阻塞等待结果返回,而是基于回调通知机制,原本同步模式等待时间,则可以用来处理其它任务, 科普:在 Web 服务器方面,著名...子进程在启动过程,根据文件描述符去连接这个已存在IPC通道,从而完成父子进程之间连接。...Node.js句柄传递 讲句柄之前,先想一个问题,send句柄发送时候,真的是将服务器对象发送给了子进程?...pm2 reloadNamepm2 restartName 应用程序代码有更新,可以用重载来加载新代码,也可以用重启来完成,reload可以做到0秒宕机加载新代码,restart则是重新启动,生产环境多用

2.2K10

深入理解Node.js 进程与线程(8000长文彻底搞懂)

Node.js 开发过程,错误会引起整个应用退出,应用健壮性值得考验,尤其是错误异常抛出,以及进程守护是必须要做。...进行多任务执行,适合于 I/O 密集型应用场景,因为异步,程序无需阻塞等待结果返回,而是基于回调通知机制,原本同步模式等待时间,则可以用来处理其它任务, 科普:在 Web 服务器方面,著名...子进程在启动过程,根据文件描述符去连接这个已存在IPC通道,从而完成父子进程之间连接。...Node.js句柄传递 讲句柄之前,先想一个问题,send句柄发送时候,真的是将服务器对象发送给了子进程?...pm2 reloadNamepm2 restartName 应用程序代码有更新,可以用重载来加载新代码,也可以用重启来完成,reload可以做到0秒宕机加载新代码,restart则是重新启动,生产环境多用

91020

Nodejs进阶:如何玩转子进程(child_process)

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 模块概览 在node,child_process这个模块非常重要。...掌握了它,等于在node世界开启了一扇新大门。熟悉shell脚本同学,可以用它来完成很多有意思事情,比如文件压缩、增量部署等,感兴趣同学,看文本文后可以尝试下。...此外,nodejs监听了SIGINT和SIGTERM信号,也就是说,nodejs收到这两个信号时,不会立刻退出,而是先做一些清理工作,然后重新抛出这两个信号。...SIGINT:interrupt,程序终止信号,通常在用户按下CTRL+C时发出,用来通知前台进程终止进程。...SIGTERM:terminate,程序结束信号,该信号可以被阻塞和处理,通常用来要求程序自己正常退出。shell命令kill缺省产生这个信号。

3.2K50

NodeJS模块研究 - process

例如 node --harmony script.js --version ,--harmony 就是传给 node 参数 传给进程参数。...例如在退出前需要一些异步操作,那么可以写在 beforeExit 事件: let hasSend = false; process.on("beforeExit", () => { if (hasSend...此时,任务队列完成所有任务后,又回触发 beforeExit 事件。因此,不处理的话,可能出现死循环情况。如果是显式调用 exit(),那么不会触发此事件。...exit 事件 在 exit 事件,只能执行同步操作。在调用 ‘exit’ 事件监听器之后,Node.js 进程将立即退出,从而导致在事件循环中仍排队任何其他工作被放弃。...深入理解 process.nextTick 我第一次看到 process.nextTick 时候是比较懵,看文档可以知道,它用途是:把回调函数作为微任务,放入事件循环任务队列

1.5K20

Node.js 多进程线程 —— 日志系统架构优化实践

2.4.1 Node.js 进程退出原因 在实际 Node.js 进程使用,如果异常处理不当,会造成进程退出,使服务不可用。...Node.js 退出原因有以下几种: Node.js 事件循环不再需要执行任何额外工作,这是一种最常见进程退出原因,当运行一个 js 文件时,发现文件执行完成之后,进程会自动退出,其原因就是因为事件循环不需要执行额外工作...$ kill -USR2 2.4.2 处理异常方式 对于上述造成 Node.js 退出原因,都有其解决办法。...Node.js 事件循环不再需要执行任何额外工作,可以在事件循环中定时添加任务,例如 setInterval 会定时添加任务,阻止进程退出。...这样,当线程池分配任务时,会分配给已经退出线程,而已经退出线程不具备处理任务能力,因此造成进程间通信超时。

1.2K30

深入理解Node.js进程与子进程

例如 node --harmony script.js --version ,--harmony 就是传给 node 参数传给进程参数。...例如在退出前需要一些异步操作,那么可以写在 beforeExit 事件:let hasSend = false;process.on("beforeExit", () => { if (hasSend...此时,任务队列完成所有任务后,又回触发 beforeExit 事件。因此,不处理的话,可能出现死循环情况。如果是显式调用 exit(),那么不会触发此事件。...exit 事件在 exit 事件,只能执行同步操作。在调用 'exit' 事件监听器之后,Node.js 进程将立即退出,从而导致在事件循环中仍排队任何其他工作被放弃。...深入理解 process.nextTick我第一次看到 process.nextTick 时候是比较懵,看文档可以知道,它用途是:把回调函数作为微任务,放入事件循环任务队列

1.8K21

Nodejs进阶:如何玩转子进程(child_process)

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 模块概览 在node,child_process这个模块非常重要。...掌握了它,等于在node世界开启了一扇新大门。熟悉shell脚本同学,可以用它来完成很多有意思事情,比如文件压缩、增量部署等,感兴趣同学,看文本文后可以尝试下。...此外,nodejs监听了SIGINT和SIGTERM信号,也就是说,nodejs收到这两个信号时,不会立刻退出,而是先做一些清理工作,然后重新抛出这两个信号。...SIGINT:interrupt,程序终止信号,通常在用户按下CTRL+C时发出,用来通知前台进程终止进程。...SIGTERM:terminate,程序结束信号,该信号可以被阻塞和处理,通常用来要求程序自己正常退出。shell命令kill缺省产生这个信号。

3.9K80
领券