前言

想要退出正在运行的 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 程序退出码的方法以及退出码枚举。

~

~本文完,感谢阅读!

~

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

大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

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

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

获取 NodeJS 程序退出码相关推荐

  1. 小程序代码反编译获取小程序源码nodejs

    第一步,360软件管理里面搜雷电模拟器4,然后按装 第二步,打开后按顺序下载,微信(用来打开小程序来获取小程序源码的wxapkg文件),QQ(从本地电脑发RE管理器到模拟器中进行安装),在模拟器中安装 ...

  2. 两步快速获取小程序源码

    最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了某个小程序的前端实现,在实际练手中,完全是黑盒的,纯靠推测,部分效果在各种尝试后能能做出大致的实现,但是有些细节,实在不知道如 ...

  3. 使用安卓模拟器获取任意小程序源码完整教程(多图预警!)

    刚刚get到一个新技能,趁着热乎赶紧整理出来分享给大家.本教程适用于任何小程序的反编译,但大多数项目都做了代码的压缩混淆,尤其是使用第三方框架的.而且小程序开发工具也会做一层编译,所以破解得到的项目实 ...

  4. 只需两步快速获取微信小程序源码

    第一次在掘金这样高大上的社区写文章,忐忑地敲下我获取小程序源码过程中的经验分享. 最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了某个小程序的前端实现,过程一言难尽,差不多两 ...

  5. 反编译获取任何微信小程序源码——看这篇就够了(最新)

    一 准备工具 1 node.js 运行环境 下载地址:https://nodejs.org/en/ 2 反编译的脚本 链接:https://pan.baidu.com/s/1InxRoozDDb-C- ...

  6. 获取PC端微信小程序源码

    获取PC端微信小程序源码 参考文章链接 链接1 链接2 准备工具 解密工具 UnpackMiniApp.exe 下载链接 逆向工具 wxappUnpacker 下载链接1 下载链接2 整体流程 第 1 ...

  7. 只需两步获取任何微信小程序源码

    只需两步获取任何微信小程序源码 kedwan关注 12018.09.15 09:32:43字数 2,428阅读 3,946 转载自百家号作者:不忘初心lucy 第一次在掘金这样高大上的社区写文章,忐忑 ...

  8. 小程序 获取带参数太阳码的参数,并解析出来(wxacode.getUnlimited)

    首先,我这边使用的是小程序的第二种场景码,前提是你这个小程序必须是已经发布的 点击跳转查看详细官方文档:获取小程序 这个码需要后台配置生成好太阳码然后返回给前端. 假设:你传给后台的page为:&qu ...

  9. 关于Qt退出码255的一点总结

    Qt程序退出码255 先说症状,程序运行正常,但是在关闭程序时,却出现的异常,提示退出码为255.查看了一翻代码,也没有找到有什么问题,百度上也没找到有效的解决方法.后来偶然发现了问题所在,原因是在析 ...

最新文章

  1. 风清杨之Oracle的安装与说明
  2. linux fedora下vscode终端字体间距不正常解决办法
  3. 「Apollo」直接在docker内部安装miniconda失败
  4. 【Tools】MarkDown教程(一)-MarkDown简介
  5. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法:三十张图弄懂「图的两种遍历方式」...
  6. 生成0到9之间的随机整数
  7. slice 和splice 的区别 js
  8. Azure 网站上的 Java
  9. FindBugs-IDEA插件的使用
  10. 为企业选择最合适的SSL证书
  11. 标签打印软件如何灵活调整打印方向
  12. Linux初级入门百篇-lsof工具
  13. 联想笔记本快捷键控制千千静听 2009年10月2日19:09:44
  14. 面试经验之北京掌上先机
  15. NBA联赛全面暂停!VR直播观赛会跃身主流吗?
  16. 51nod lyk与gcd
  17. st7920驱动OCMJ2X8C屏使用CGRAM自定义图标
  18. TNS-12546 TNS-12560 TNS-00516
  19. iOS各浏览器、macOS的safari无法使用websocket问题
  20. PyTorch可视化工具:GPU内存分配

热门文章

  1. Scala的所有符号运算符都意味着什么?
  2. 如何在iOS 9中启用“应用程序传输安全性”的情况下加载HTTP URL? [重复]
  3. 查找包含特定值的数组的文档
  4. android中搜索对话框,android – 如何使用onSearchRequested()调用搜索对话框
  5. JAVA:jar包下载地址大全
  6. 武汉理工大学合肥工业大学 计算机,合工大为什么从985降到211?附合肥工业大学211地位(合工大不是985)...
  7. java方法中与参数怎么调用,java中怎么从一个方法中调用另一个方法中的参数?(以及如何提取数字)...
  8. Java中的Bean是什么?
  9. Open3d之对点云进行DBSCAN 聚类
  10. 智能高柜机器人_再装修说啥也不能忘,橱柜旁边预留50公分,打高柜能多个家政间...