我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何主动终止Node.js进程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何主动终止Node.js进程

这篇文章主要介绍了如何主动终止Node.js进程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

js的作用是什么

1、能够嵌入动态文本于HTML页面。2、对浏览器事件做出响应。3、读写HTML元素。4、在数据被提交到服务器之前验证数据。5、检测访客的浏览器信息。6、控制cookies,包括创建和修改等。7、基于Node.js技术进行服务器端编程。

有几个原因会导致 Node.js 进程终止。其中一些是可以避免的,例如抛出错误时,而另一些是无法防止的,例如内存不足。全局 process 是一个 Event Emitter 实例,当执行正常退出时,将发出一个 exit 事件。然后程序代码可以通过侦听这个事件来执行最后的同步清理工作。

下面是可以主动触发进程终止的一些方法:

操作例子
手动流程退出process.exit(1)
未捕获的异常throw new Error()
未兑现的 promisePromise.reject()
忽略的错误事件EventEmitter#emit('error')
未处理的信号$ kill <PROCESS_ID>

其中有许多是属于偶然被触发的,例如未捕获的错误或未处理的 promise,但是其中也有为了直接使进程终止而创建的。

进程退出

使用 process.exit(code) 来终止进程是最直接的方法。这在当你知道自己的过程已经到了生命周期的尽头时非常有用。  code 值是可选的,默认值为0,最大可以设为 255。0 表示进程运行成功,而任何非零的数字都表示发生了问题。这些值可以被许多不同的外部工具使用。例如当测试套件运行时,非零值表示测试失败。

直接调用 process.exit() 时,不会向控制台写入任何隐式文本。如果你编写了以错误表示形式调用此方法的代码,则你的代码应该用户输出错误来帮助他们解决问题。例如运行以下代码:

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

在这种情况下,单行的 Node.js 程序不会输出任何信息,尽管 shell 程序确实会打印退出状态。遇到这样的进程退出,用户将无法理解究竟发生了什么事情。所以要参考下面这段程序配置错误时会执行的代码:

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

在这种情况下,用户没会很清楚发生了什么。他们运行这个程序,将错误输出到控制台上,并且他们能够纠正这个问题。

process.exit() 方法非常强大。尽管它在程序代码中有自己的用途,但实际上绝对不应该将其引入可重用的库中。如果在库中确实发生了错误,则应抛出这个错误,以便程序可以决定应该如何处理它。

exceprion、rejection 和发出的 Error

虽然 process.exit() 很有用,但对于运行时错误,你需要使用其他工具。例如当程序正在处理 HTTP 请求时,一般来说错误不应该终止进程,而是仅返回错误响应。发生错误的位置信息也很有用,这正是应该抛出 Error 对象的地方。

Error 类的实例包含对导致错误的原因有用的元数据,例如栈跟踪信息和消息字符串。从 Error 扩展你自己的错误类是很常见的操作。单独实例化 Error 不会有太多副作用,如果发生错误则必须抛出。

在使用 throw 关键字或发生某些逻辑错误时,将引发 Error。发生这种情况时,当前栈将会“展开”,这意味着每个函数都会退出,直到一个调用函数将调用包装在 try/catch 语句中为止。遇到此语句后,将调用 catch 分支。如果错误没有被包含在 try/catch 中,则该错误被视为未捕获。

虽然你应该使用带有 Errorthrow 关键字,例如 throw new Error('foo'),但从技术上讲,你可以抛出任何东西。一旦抛出了什么东西,它就被认为是一个例外。抛出 Error 实例非常重要,因为捕获这些错误的代码很可能会期望得到错误属性。

Node.js 内部库中常用的另一种模式是提供一个 .code 属性,该属性是一个字符串值,在发行版之间应保持一致。比如错误的 .code 值是 ERR_INVALID_URI,即使是供人类可读的 .message 属性可能会更改,但这个 code 值也不应被更改。

可悲的是,一种更常用的区分错误的模式是检查 .message 属性,这个属性通常是动态的,因为可能回需要修改拼写错误。这种方法是很冒险的,也是容易出错的。 Node.js 生态中没有完美的解决方案来区分所有库中的错误。

当引发未捕获的错误时,控制台中将打印栈跟踪信息,并且进程将回以退出状态 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 是一个事件发射器,可以通过侦听 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 拒绝与抛出错误非常相似。如果 Promise 中的 reject() 方法被调用,或者在异步函数中引发了错误,则 Promise 可以拒绝。在这方面,以下两个例子大致相同:

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

这是输出到控制台的消息:

(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().

与未捕获的异常不同,从 Node.js v14 开始,这些 rejection 不会使进程崩溃。在未来的 Node.js 版本中,会使当前进程崩溃。当这些未处理的 rejection 发生时,你还可以拦截事件,侦听 process 对象上的另一个事件:

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

事件发射器是 Node.js 中的常见模式,许多对象实例都从这个基类扩展而来,并在库和程序中使用。它们非常欢迎,值得和 error 与 rejection 放在一起讨论。

当事件发射器发出没有侦听器的 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}

确保在你使用的事件发射器实例中侦听 error 事件,以便你的程序可以正常处理事件而不会崩溃。

信号

信号是操作系统提供的机制,用于把用数字表示的消息从一个程序发送到另一个程序。这些数字通常用等价的常量字符串来表示。例如,信号 SIGKILL 代表数字信号 9。信号可以有不同的用途,但通常用于终止程序。

不同的操作系统可以定义不同的信号,但是下面列表中的信号一般是通用的:

名称编号可处理Node.js 默认信号用途
SIGHUP1终止父终端已关闭
SIGINT2终止终端试图中断,按下 Ctrl + C
SIGQUIT3终止终端试图退出,按下 Ctrl + D
SIGKILL9终止进程被强行杀死
SIGUSR110启动调试器用户定义的信号1
SIGUSR212终止用户定义的信号2
SIGTERM12终止代表优雅的终止
SIGSTOP19终止进程被强行停止

如果程序可以选择实现信号处理程序,则 Handleable 一列则为。为的两个信号无法处理。 Node.js 默认 这一列告诉你在收到信号时,Node.js 程序的默认操作是什么。最后一个信号用途指出了信号对应的作用。

在 Node.js 程序中处理这些信号可以通过侦听 process 对象上的更多事件来完成:

#!/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 信号。切换到另一个终端窗口,并根据输出的进程 ID 值执行以下命令:

$ kill -s SIGHUP <PROCESS_ID>

这演示了一个程序怎样向另一个程序发送信号,并且在第一个终端中运行的 Node.js 程序中输出它所接收到的 SIGHUP 信号。

你可能已经猜到了,Node.js 也能把命令发送到其他程序。可以用下面的命令以把信号从临时的 Node.js 进程发送到你现有的进程:

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

这还会在你的第一个程序中显示 SIGHUP 消息。现在,如果你想终止第一个进程,要运行下面的命令向其发送不能处理的 SIGKILL 信号:

$ kill -9 <PROCESS_ID>

这时程序应该结束。

这些信号在 Node.js 程序中经常用于处理正常的关闭事件。例如,当 Kubernetes Pod 终止时,它将向程序发送 SIGTERM 信号,之后启动 30 秒计时器。然后程序可以在这 30 秒内正常关闭自己,关闭连接并保存数据。如果该进程在此计时器后仍保持活动状态,则 Kubernetes 将向其发送一个 SIGKILL

感谢你能够认真阅读完这篇文章,希望小编分享的“如何主动终止Node.js进程”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何主动终止Node.js进程

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

下载Word文档

猜你喜欢

如何主动终止Node.js进程

这篇文章主要介绍了如何主动终止Node.js进程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。js的作用是什么1、能够嵌入动态文本于HTML页面。2、对浏览器事件做出响应。3
2023-06-14

qt如何启动和终止进程

本篇内容介绍了“qt如何启动和终止进程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!进程通信的范围非常大,也有很多的方法。其中的有些方法甚至
2023-06-19

Linux进程如何终止

这篇文章将为大家详细讲解有关Linux进程如何终止,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux进程终止简介进程终止是指操作系统关闭一个进程的机制。在Linux中,进程可以通过多种方式终止,包括正常退出、异常终止和强制终止。正常退出正常退出是进程通过调用exit()系统调用
Linux进程如何终止
2024-04-02

如果父进程终止则终止 exec

哈喽!大家好,很高兴又见面了,我是编程网的一名作者,今天由我给大家带来一篇《如果父进程终止则终止 exec》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!问题内容我有一段 go 代
如果父进程终止则终止 exec
2024-04-04

服务器如何终止进程

服务器可以通过以下几种方式终止进程:1. 使用kill命令:kill命令用于向进程发送信号,通常用于终止进程。可以使用以下命令终止进程:```kill ```其中,进程ID是要终止的进程的唯一标识符。2. 使用pkill命令:pkill命令
2023-10-11

linux如何查找进程及终止进程操作

本篇内容主要讲解“linux如何查找进程及终止进程操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux如何查找进程及终止进程操作”吧!使用linux操作系统,难免遇到一些软件“卡壳”的问
2023-06-13

C++并发编程:如何进行线程终止和取消?

c++++ 中线程终止和取消机制包括:线程终止:std::thread::join() 阻塞当前线程直到目标线程完成执行;std::thread::detach() 从线程管理中分离目标线程。线程取消:std::thread::reques
C++并发编程:如何进行线程终止和取消?
2024-05-06

pycharm如何终止程序运行

在 pycharm 中终止程序运行的方法有:快捷键:windows/linux:ctrl + f2;macos:⌘ + f2菜单栏:"运行" → "停止程序"工具栏图标:点击红色的正方形 "停止" 图标在 PyCharm 中终止程序运行在
pycharm如何终止程序运行
2024-04-25

小程序中如何主动调用停止录音

这篇“小程序中如何主动调用停止录音”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“小程序中如何主动调用停止录音”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们
2023-06-26

详解C#如何优雅地终止线程

在大多情况下,我们只关心线程的创建与启动,运行,却并不关心线程的结束或者终止。今天这篇文章,我们就以一些简单的小例子,简述如何有效的停止线程,仅供学习分享使用,如有不足之处,还请指正
2023-03-21

windows和linux下查看80端口号占用(被哪个进程占用?如何终止)

1、在Windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等 这里主要是用到windows下的DOS工具,点击"开始"--"LubrvIJIS;运行",输入"cmd"后点击确定按钮,进入DOS窗口,接下来分别运行以下
2023-05-30

一文揭晓如何在Java中终止一个线程

工作中我们经常会用到线程,一般情况下我们让线程执行就完事了,那么你们有没有想过如何去终止一个正在运行的线程呢?本文就来带大家一起看看
2023-03-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录