返回顶部
首页 > 资讯 > 精选 >如何主动终止Node.js进程
  • 178
分享到

如何主动终止Node.js进程

2023-06-14 18:06:54 178人浏览 薄情痞子
摘要

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

这篇文章主要介绍了如何主动终止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进程”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: 如何主动终止Node.js进程

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

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

猜你喜欢
  • 如何主动终止Node.js进程
    这篇文章主要介绍了如何主动终止Node.js进程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。js的作用是什么1、能够嵌入动态文本于HTML页面。2、对浏览器事件做出响应。3...
    99+
    2023-06-14
  • qt如何启动和终止进程
    本篇内容介绍了“qt如何启动和终止进程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!进程通信的范围非常大,也有很多的方法。其中的有些方法甚至...
    99+
    2023-06-19
  • 如果父进程终止则终止 exec
    哈喽!大家好,很高兴又见面了,我是编程网的一名作者,今天由我给大家带来一篇《如果父进程终止则终止 exec》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面...
    99+
    2024-04-04
  • 服务器如何终止进程
    服务器可以通过以下几种方式终止进程:1. 使用kill命令:kill命令用于向进程发送信号,通常用于终止进程。可以使用以下命令终止进...
    99+
    2023-10-11
    服务器
  • python中如何终止当前进程
    python中终止当前进程的方法:1、在win操作系统中找到python程序目录;2、打开idle工具;3、在idle中新建一个shell脚本;4、输入“import os”指令导入os模块;5、通过“os.exit()”指令终止当前进即可...
    99+
    2024-04-02
  • linux如何查找进程及终止进程操作
    本篇内容主要讲解“linux如何查找进程及终止进程操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux如何查找进程及终止进程操作”吧!使用linux操作系统,难免遇到一些软件“卡壳”的问...
    99+
    2023-06-13
  • shell脚本怎么自动终止进程
    要自动终止进程,可以编写一个shell脚本来实现。下面是一个示例脚本,可以通过进程名自动终止对应的进程: #!/bin/bash ...
    99+
    2024-04-02
  • C++并发编程:如何进行线程终止和取消?
    c++++ 中线程终止和取消机制包括:线程终止:std::thread::join() 阻塞当前线程直到目标线程完成执行;std::thread::detach() 从线程管理中分离目标...
    99+
    2024-05-06
    线程 并发编程 c++
  • pycharm如何终止程序运行
    在 pycharm 中终止程序运行的方法有:快捷键:windows/linux:ctrl + f2;macos:⌘ + f2菜单栏:"运行" → "停止程序"工具栏图标:点击红色的正方形...
    99+
    2024-04-25
    linux macos pycharm
  • 如何在PHP中进行启动和停止进程?
    在PHP中进行启动和停止进程,可以使用系统进程控制函数(Process Control Functions)来实现。在这篇文章中,我们会讨论如何使用这些函数来控制进程,包括启动、停止和等待进程结束。一、启动进程在PHP中启动进程可以使用pc...
    99+
    2023-05-20
    PHP 进程 启动/停止
  • Linux进程控制【创建、终止、等待】
    ✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Good judgment comes fro...
    99+
    2023-08-20
    linux 运维 服务器 进程 云原生
  • 高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务
    目录 前言一、nohup命令详解1-1、nohup命令介绍1-2、语法格式1-2-1、基础语法介绍1-2-2、执行脚本文件1-2-3、执行python文件1-2-4、拓展延申:在服务器上运行后...
    99+
    2023-09-11
    linux unix 服务器
  • JavaScript如何终止循环
    本篇内容介绍了“JavaScript如何终止循环”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 如何停止mongodb进程
    停止mongodb进程的方法:1、在终端登录mongodb,使用“Crtl+C”关闭停止mongodb进程;2、使用数据库“db.shutdownServer();”命令关闭停止mongodb进程;3、使用mongod命令的shutdown...
    99+
    2024-04-02
  • 解决MySQL 错误1067: 进程意外终止
    我的情况是下载过xampp但是放在了不同的盘中,C盘和D盘都有xampp。不管是全部卸载还是只卸载一个,都出现了1067错误,进程意外终止,mysql完全无法启动(MySQL刚开始会出现PID,但是Port这里没有显示,很快又会显示MySQ...
    99+
    2023-09-06
    php 开发语言 Powered by 金山文档
  • Dos下终止进程的方法是什么
    这篇文章主要介绍“Dos下终止进程的方法是什么”,在日常操作中,相信很多人在Dos下终止进程的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Dos下终止进程的方法是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-09
  • 小程序中如何主动调用停止录音
    这篇“小程序中如何主动调用停止录音”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“小程序中如何主动调用停止录音”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们...
    99+
    2023-06-26
  • 详解C#如何优雅地终止线程
    目录需求说明初始版本进阶版本最终版本在刚接触后台线程的时候,觉得线程神秘且高深,并且时常有先辈们千叮万嘱:能不用的时候,尽量不要用,千万不要滥用线程,否则会发生预料不到的结果。在接触...
    99+
    2023-03-21
    C#终止线程 C#线程
  • 如何在java中终止Stream
    如何在java中终止Stream?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌...
    99+
    2023-06-14
  • Java8中Stream API如何终止
    这篇文章主要为大家展示了“Java8中Stream API如何终止”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java8中Stream API如何终止”这篇文章吧。1.写在前面我们都知道Str...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作