广告
返回顶部
首页 > 资讯 > 精选 >NodeJS进程是怎么退出的
  • 529
分享到

NodeJS进程是怎么退出的

2023-06-20 15:06:28 529人浏览 薄情痞子
摘要

本篇内容介绍了“nodejs进程是怎么退出的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言主动退出Exceptions, Rejec

本篇内容介绍了“nodejs进程是怎么退出的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • 前言

  • 主动退出

  • Exceptions, Rejections 和 Emitted Errors

  • 信号

  • 小结

前言

有几种因素可以导致 nodejs 进程退出。在这些因素中,有些是可预防的,比如代码抛出了一个异常;有些是不可预防的,比如内存耗尽。process 这个全局变量是一个 Event Emitter 实例,如果进程优雅退出,process 会派发一个 exit 事件。应用代码可以监听这个事件,来做最后的清理工作。

下面的表格列举了可以导致进程退出的因素。

操作举例
手动退出process.exit(1)
未捕获的异常throw new Error()
未处理的 promise rejectionPromise.reject()
未处理的 error 事件EventEmitter#emit('error')
未处理的信号kill <PROCESS_ID>

主动退出

process.exit(code) 是最直接的结束进程的方法。code 参数是可选的,可以为 0 ~ 255 之间任何数字,默认为 0。0 表示进程执行成功,非 0 数字表示进程执行失败。

当 process.exit() 被使用时,控制台不会有任何输出,如果我们想在进程推出的时候像控制台输出一些错误说明信息,则需要在调用之前显示的输出错误信息。

node -e "process.exit(42)"echo $?

上面的代码直接退出了 NodeJS 进程,命令行没有任何输出信息。用户在遭遇进程退出的时候,无法获取有效的错误信息。

function checkConfig(config) {  if (!config.host) {    console.error("Configuration is missing 'host' parameter!");    process.exit(1);  }}

在上面的代码中,我们在进程退出之前输出的明确的错误信息。

process.exit() 的功能非常强大,但是我们不应该在工具库中使用。如果在工具库中遇到的错误,我们应该以异常的形式抛出,从而让应用代码决定如何处理这个错误。

Exceptions, Rejections 和 Emitted Errors

process.exit() 在应用启动配置检查等场景中非常有用,但是在处理运行时异常时,它并不适用,我们需要其他的工具。

比如当应用在处理一个 Http 请求时,一个错误不应该导致进程终止,相反,我们应该返回一个含有错误信息的响应。

Error 类可以包含描述错误发生的详细信息的数据,比如调用堆栈和错误文本。通常我们会定义特定场景的 XXXError,这些 XXXError 都继承制 Error 类。

当我们使用 throw 关键字,或者代码逻辑出错时,一个错误就会被抛出。此时,系统调用栈会释放,每个函数会退出,直到遇到一个 包裹了当前调用的 try/catch 语句。如果没有 try/catch 语句,则这个错误会被认为是未捕获的异常。

通常,在 NodeJS 应用中,我们会给 Error 类定义一个 code 属性,作为用来描述具体错误的错误码,这么做的优点是可以使错误码保持唯一,同时还能使得错误码是可读的。同时,我们也可以配合 message 属性来描述具体的错误信息。

当一个未捕获的异常抛出时,控制台会打印调用堆栈,同时进程退出,退出状态码为 1.

/tmp/foo.js:1throw new TypeError('invalid foo');^Error: invalid foo    at Object.<anonymous> (/tmp/foo.js:2:11)    ... TRUNCATED ...    at internal/main/run_main_module.js:17:47

这段控制台输出信息说明,错误发生在 foo.js 中的第 2 行第 11 列。

全局变量 process 是个 Event Emitter 实例,可以通过监听 uncaughtException 事件来处理这些未捕获异常。下面的代码展示了如何使用:

const logger = require("./lib/logger.js");process.on("uncaughtException", (error) => {  logger.send("An uncaught exception has occured", error, () => {    console.error(error);    process.exit(1);  });});

Promise Rejection 与抛出异常类似。我们可以通过调用 reject() 函数或者在 async 函数中抛出异常来是的 promise 到达 rejected 状态。下面的两段代码功能是相似的。

Promise.reject(new Error("oh no"));(async () => {  throw new Error("oh no");})();

目前,在 NodeJS 14 中,Promise Rejection 不会导致进程退出,在后续的版本中,Promise Rejection 可能会导致进程退出。

下面是一段未捕获的 Promise Rejection 的控制台输出样例。

(node:52298) UnhandledPromiseRejectionWarning: Error: oh no
    at Object.<anonymous> (/tmp/reject.js:1:16)
    ... TRUNCATED ...
    at internal/main/run_main_module.js:17:47
(node:52298) UnhandledPromiseRejectionWarning: Unhandled promise
  rejection. This error originated either by throwing inside of an
  async function without a catch block, or by rejecting a promise
  which was not handled with .catch().

我们可以通过监听 unhandledRejection 事件来处理未捕获的 Rejection. 样例代码如下:

process.on("unhandledRejection", (reason, promise) => {});

Event Emitter 是 NodeJS 中的基础模块,应用广泛。当 Event Emitter 的 error 事件未被处理时,Event Emitter 就会抛出一个错误,同时会导致进程退出。下面是一个 Event Emitter error 的控制台输出。

events.js:306
    throw err; // Unhandled 'error' event
    ^
Error [ERR_UNHANDLED_ERROR]: Unhandled error. (undefined)
    at EventEmitter.emit (events.js:304:17)
    at Object.<anonymous> (/tmp/foo.js:1:40)
    ... TRUNCATED ...
    at internal/main/run_main_module.js:17:47 {
  code: 'ERR_UNHANDLED_ERROR',
  context: undefined
}

因此,我们在使用 Event Emitter 的时候,要确保监听了 error 事件,这样在发生错误的时候,可以使得应用能够处理这些错误,避免奔溃。

信号

信号是操作信息提供了进程间通信机制。信号通常是一个数字,同时也可以使用一个字符串来标识。比如 SIGKILL 标识数字 9。不同的操作系统对信号的定义不同。下面表格里罗列的是基本通用的信号定义。

名称数字是否可处理NodeJS 默认行为信号的含义
SIGHUP1Yes退出父命令行被关闭
SIGINT2Yes退出命令行尝试中断,即 Ctrl + C
SIGQUIT3Yes退出命令行尝试退出,即 Ctrl + Z
SIGKILL9No退出强制进程退出
SIGUSR110Yes启动调试器用户自定义信号
SIGUSR212Yes退出用户自定义信号
SIGTERM15Yes退出进程优雅的退出
SIGSTOP19No退出进程被强制停止

这表格里,是否可处理表示这个信号是否可被进程接收并被处理。NodeJS 默认行为表示进程在接收到这个信号以后默认执行的动作。

我们可以通过如下方式来监听这些信号。

#!/usr/bin/env nodeconsole.log(`Process ID: ${process.pid}`);process.on("SIGHUP", () => console.log("Received: SIGHUP"));process.on("SIGINT", () => console.log("Received: SIGINT"));setTimeout(() => {}, 5 * 60 * 1000); // keep process alive

在一个命令行窗口中运行这段代码,然后按下 Ctrl + C,此时进程不会退出,而是会在控制台打印一行接收到了 SIGINT 信号的日志信息。新起一个命令行窗口,执行如下命令,PROCESS_ID 为上面程序输出的进程 ID。

kill -s SIGHUP <PROCESS_ID>

通过新起的命令行,我们向原来的那个程序进程发送了一个 SIGHUP 信号,原来的命令行窗口中会打印一行接收到了 SIGHUP 信号的日志信息。

在 NodeJS 代码中,进程也可以给其他进程发送信号。比如:

node -e "process.kill(<PROCESS_ID>, 'SIGHUP')"

这段代码同样会在第一个命令行窗口中输出一行接收到了 SIGHUP 信号的日志。

如果我们要让第一个命令行窗口的进程退出,则可以通过下面的命令来实现。

kill -9 <PROCESS_ID>

在 NodeJS 中,信号通常被用作控制进程优雅的退出。比如,在 kubernetes 中,当一个 pod 要退出时,k8s 会像 pod 内的进程发送一个 SIGTERM 的信号,同时启动一个 30 秒的定时器。应用程序有 30 秒的时间来关闭连接、保存数据等。如果 30 秒之后进程依然存活,k8s 会再发送一个 SIGKILL 来强制关闭进程。

小结

本文讲述了可以导致进程退出的几种因素,分别是:

  • 主动退出

  • 未捕获的异常、未处理的 promise rejection、未处理的 Event Emitter error 事件

  • 系统信号

“NodeJS进程是怎么退出的”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: NodeJS进程是怎么退出的

本文链接: https://www.lsjlt.com/news/298023.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • NodeJS进程是怎么退出的
    本篇内容介绍了“NodeJS进程是怎么退出的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言主动退出Exceptions, Rejec...
    99+
    2023-06-20
  • 详细谈谈NodeJS进程是如何退出的
    目录前言主动退出 Exceptions, Rejections 和 Emitted Errors 信号 小结 前言 有几种因素可以导致 NodeJS 进程退出。在这些因素中,有些是可...
    99+
    2022-11-12
  • Node.js进程退出的原理是什么
    今天小编给大家分享一下Node.js进程退出的原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。原理一个进程要退出,无...
    99+
    2023-06-29
  • 导致Node.js进程退出的情况是什么
    这篇文章主要介绍“导致Node.js进程退出的情况是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“导致Node.js进程退出的情况是什么”文章能帮助大家解决问题...
    99+
    2022-10-19
  • ubuntu退出程序的方法是什么
    这篇文章主要讲解了“ubuntu退出程序的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ubuntu退出程序的方法是什么”吧!打开命令行窗口,通过以下命令杀掉对应的进程来退出。方法...
    99+
    2023-07-04
  • Node.js进程退出的深入理解
    目录背景介绍原理系统信号通知退出进程主动退出应用实践进程优雅退出总结背景介绍 在我们的服务发布后,难免会被运行环境(如容器、pm2 等)调度、升级服务导致重启、各种异常导致进程崩溃;...
    99+
    2022-11-13
  • java程序不退出怎么办?
    在我们编程java窗口程序代码的时候,总是会遇到运行的窗口关闭而程序没有退出的问题,所以今天就为大家介绍下怎么解决。java程序不退出怎么办?java程序不退出,是因为创建程序时,缺少了setDefaultCloseOperation(JF...
    99+
    2015-11-05
    java入门 java 程序 退出
  • 腾讯轻量应用服务器退款流程是什么呢怎么退出
    首先,您需要登录腾讯云服务器管理系统(http://cloud.tencentcloud.com/),找到您购买的轻量应用服务器的用户名和密码。 在用户中心中,您可以找到“退款”选项。点击后,您可以进入退款申请页面。在这里,您需要详细描述...
    99+
    2023-10-28
    腾讯 什么呢 流程
  • nodejs中process进程的作用是什么
    这期内容当中小编将会给大家带来有关nodejs中process进程的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  进程模块  process模块允许你获得或...
    99+
    2022-10-19
  • win10怎么退出测试模式? 一个命令退出测试模式的教程
      部分用户安装Win10 10586后,在使用时发现屏幕右下角出现了“测试模式 Windows10专业版 10586”的水印。这是怎么回事呢用户不小心开启测试模式导致的。如果想要去除这个水印的话...
    99+
    2023-05-21
    win10 测试模式
  • nodejs中向HTTP响应传送进程的输出
    废话不多说了,直接给大家贴代码了,具体代码如下所述: var spawn = require('child_process').spawn; require('http').createServer(f...
    99+
    2022-06-04
    中向 进程 nodejs
  • c语言怎么设置退出程序
    在C语言中,可以通过返回一个整数值来设置退出程序。一般情况下,返回0表示程序正常退出,而返回其他非零值则表示程序异常退出。具体的做法...
    99+
    2023-10-23
    c语言
  • nodejs怎么结束一个进程
    Node.js 是基于 V8 引擎的 JavaScript 运行环境,是目前前端开发最常用的技术之一。在 Node.js 中,进程是一个非常重要的概念,每个 Node.js 应用程序都会启动一个进程来运行。在一些情况下,我们需要手动结束运行...
    99+
    2023-05-14
  • NodeJS中的进程管理怎么实现
    这篇文章主要介绍“NodeJS中的进程管理怎么实现”,在日常操作中,相信很多人在NodeJS中的进程管理怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”NodeJS中的...
    99+
    2022-10-19
  • windows10开机进入安全模式怎么退出windows10开机进入安全模式退出方式
    有客户在windows10开机的情况下进入了安全中心,可是不清楚怎么退出来,最先大家开启windows10计算机的运行窗口,键入msconfig指令回车键,这样就能打开服务窗口,将安全引导选择项的勾除掉,最终点一下储存重启计算机就能够退出啦...
    99+
    2023-07-16
  • android退出app的方法是什么
    在 Android 中,退出应用程序的方法有两种:1. 使用系统的返回键:在应用程序的任何界面中,按下系统的返回键即可退出应用程序。...
    99+
    2023-05-29
    android退出app android
  • 怎么在python中使用sys.exit()退出程序
    本篇文章为大家展示了怎么在python中使用sys.exit()退出程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相...
    99+
    2023-06-14
  • 怎么实现提示用户退出程序
    这篇文章主要讲解了“怎么实现提示用户退出程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现提示用户退出程序”吧!青铜级别# 青铜 ...
    99+
    2022-10-19
  • android退出app应用程序怎么实现
    在Android中,可以通过以下方式退出应用程序:1. 使用System.exit(0)方法退出应用程序。这种方式不太推荐,因为它会...
    99+
    2023-05-30
    android退出app android
  • Nodejs怎么进行多线程处理
    这篇文章主要介绍Nodejs怎么进行多线程处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Threads à gogo 是nodejs 的原生模块,使用这个模块可以让nodejs 具备多线程处理功能。【推荐学习:《...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作