首页
学习
活动
专区
工具
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 过后发送

1.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.8K100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    在 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.7K20

    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.2K21

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

    1.5K20

    nodejs process进程

    学习笔记来源于 哔哩哔哩小满zs的nodejs课程 && 网上搜索的一些资料 小满zs: process 进程_哔哩哔哩_bilibili 在Node.js中,process是一个全局对象,提供了许多与当前进程相关的方法和属性...它是一个数组,第一个元素是Node.js的可执行文件路径,第二个元素是当前执行的JavaScript文件路径,后面的元素是传递给脚本的命令行参数。...process.cwd():获取当前工作目录的路径。 process.exit([code]):退出当前进程,可选地指定一个退出码。默认的退出码是0,表示正常退出。...process.on(event, callback):监听指定的事件,并在事件发生时执行回调函数。...// process.exit(); // 杀死进程 // process.kill(pid, signal) process.on("exit",()=>{ console.log("进程退出了

    9410

    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.9K00

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

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

    1.1K30

    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.3K10

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

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

    94120

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

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

    2.6K10

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

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

    3.3K50

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

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

    1.4K30

    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的进程与子进程

    例如 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 的时候是比较懵的,看文档可以知道,它的用途是:把回调函数作为微任务,放入事件循环的任务队列中。

    2K21
    领券