获取 NodeJS 程序退出码

简介: 想要退出正在运行的 NodeJS 程序,我们既可以通过 Ctrl + C 的方式,也可以通过process.exit()来执行退出。

14.png


前言


想要退出正在运行的 NodeJS 程序,我们既可以通过 Ctrl + C  的方式,也可以通过process.exit()来执行退出。


这两种操作都将强制进程尽快退出,即使仍有未完全完成的异步操作挂起,包括对 process.stdoutprocess.stderr 的 I/O 操作。


如果由于错误情况需要终止 Node.js 进程,则抛出未捕获的错误并允许进程相应地终止比调用 process.exit() 更安全,比如:


import process from 'process';
// 如何正确设置退出码,同时让进程正常退出。
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exitCode = 1;
}


Worker 线程中,该函数停止当前线程而不是当前进程。


那么对于一些意外推出的情况,如何来获取 exitCode ?每一个退出码又代表什么?今天我们就来学习一下。


通过 NodeJS 的 child_process 子进程获取退出码


child_process.fork() 方法是 child_process.spawn() 的特例,专门用于衍生新的 NodeJS 进程。


const fork = require("child_process").fork;
console.log("main ", process.argv);
const fs = require("fs");
const fd = fs.openSync("./a.log", "a");
const child = fork("./index.js", {
    stdio: ["ipc", "pipe", fd]
});
child.on("error", (error) => {
    let info = `child process error ${error}`;
    fs.writeSync(fd, info);
    console.log(info);
});
child.on("exit", (code) => {
    let info = `child process exited with code ${code}`;
    fs.writeSync(fd, info);
    console.log(info);
});


子程序执行参数


const fork = require('child_process').fork;
console.log('main ',process.argv);
const fs=require('fs');
const fd = fs.openSync('./a.log','a');
// 子程序参数
let args = [];
args[0] = 'test';
const child = fork('./index.js',args,{
    stdio:['ipc','pipe',fd]
});
child.on('error', (error) => {
    let info = `child process error ${error}`;
    fs.writeSync(fd,info);
    console.log(info);
});
child.on('exit', (code) => {
    let info = `child process exited with code ${code}`;
    fs.writeSync(fd,info);
    console.log(info);
});


NodeJS退出码


当没有更多异步操作挂起时,NodeJS 通常会以 0 状态代码退出。 在其他情况下使用以下状态代码:


  • 1未捕获的致命异常:存在未捕获的异常,并且其没有被域或 'uncaughtException' 事件句柄处理。


  • 2: 未使用(由 Bash 保留用于内置误用)


  • 3内部 JavaScript 解析错误:NodeJS 引导过程中的内部 JavaScript 源代码导致解析错误。 这是极其罕见的,通常只能在 NodeJS 本身的开发过程中发生。


  • 4内部 JavaScript 评估失败:NodeJS 引导过程中的内部 JavaScript 源代码在评估时未能返回函数值。 这是极其罕见的,通常只能在 NodeJS 本身的开发过程中发生。


  • 5致命错误:V8 中存在不可恢复的致命错误。 通常将打印带有前缀 FATAL ERROR 的消息到标准错误。


  • 6非函数的内部异常句柄:存在未捕获的异常,但内部致命异常句柄不知何故设置为非函数,无法调用。


  • 7内部异常句柄运行时失败:存在未捕获的异常,并且内部致命异常句柄函数本身在尝试处理时抛出错误。 例如,如果 'uncaughtException'domain.on('error') 句柄抛出错误,就会发生这种情况。


  • 8: 未使用。 在以前版本的 NodeJS 中,退出码 8 有时表示未捕获的异常。


  • 9无效参数:指定了未知选项,或者提供了需要值的选项而没有值。


  • 10内部 JavaScript 运行时失败:NodeJS 引导过程中的内部 JavaScript 源代码在调用引导函数时抛出错误。 这是极其罕见的,通常只能在 NodeJS 本身的开发过程中发生。


  • 12无效的调试参数:设置了 --inspect 和/或 --inspect-brk 选项,但选择的端口号无效或不可用。


  • 13未完成的顶层等待:在顶层代码中的函数外使用了 await,但传入的 Promise 从未解决。


  • >128信号退出:如果 NodeJS 收到致命的信号,例如 SIGKILLSIGHUP,则其退出码将是 128 加上信号代码的值。 这是标准的 POSIX 实践,因为退出码被定义为 7 位整数,并且信号退出设置高位,然后包含信号代码的值。 例如,信号 SIGABRT 的值是 6,因此预期的退出码将是 128 + 6134


总结


以上就是获取 NodeJS 程序退出码的方法以及退出码枚举。


~本文完,感谢阅读!


学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!


你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!


知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!




相关文章
|
8月前
|
JavaScript 前端开发 Serverless
函数计算只支持Node.js,我用C++写的程序怎么运行?
函数计算只支持Node.js,我用C++写的程序怎么运行?
119 1
|
存储 JavaScript NoSQL
使用Node.js构建强大的后端应用程序
Node.js是一个基于Chrome V8引擎构建的JavaScript运行时环境,它可以帮助开发者构建快速、可扩展和高性能的后端应用程序。在本篇文章中,我们将介绍一些与Node.js相关的技术,让你更好地利用这个强大的工具。
207 0
|
8月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
172 1
|
5月前
|
JavaScript Java Serverless
函数计算产品使用问题之如何使用Node.js编写程序
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
JavaScript 前端开发 Windows
第一个node程序23
第一个node程序23
|
4月前
|
JavaScript Linux 开发工具
如何将nodejs项目程序部署到阿里云服务器上
该文章详细描述了将Node.js项目部署到阿里云服务器的步骤,包括服务器环境配置、项目上传及使用PM2进行服务管理的过程。
|
8月前
|
JavaScript 前端开发
基于 Node.js 环境,使用内置 http 模块,创建 Web 服务程序
基于 Node.js 环境,使用内置 http 模块,创建 Web 服务程序
|
8月前
|
JavaScript 数据库
使用 Webpack 打包 node 程序,node_modules 真的被干掉啦
使用 Webpack 打包 node 程序,node_modules 真的被干掉啦
555 0
|
8月前
|
前端开发
./ 相对路径与node程序的启动目录有关
./ 相对路径与node程序的启动目录有关
42 0
|
8月前
|
JavaScript 前端开发 API
使用NodeJS开发前端打包程序
使用NodeJS开发前端打包程序
176 0