前言
想要退出正在運作的 NodeJS 程式,我們既可以通過
Ctrl + C
的方式,也可以通過
process.exit()
來執行退出。
這兩種操作都将強制程序盡快退出,即使仍有未完全完成的異步操作挂起,包括對
process.stdout
和
process.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 通常會以
狀态代碼退出。 在其他情況下使用以下狀态代碼:
-
未捕獲的緻命異常:存在未捕獲的異常,并且其沒有被域或1
事件句柄處理。'uncaughtException'
-
: 未使用(由 Bash 保留用于内置誤用)2
-
内部 JavaScript 解析錯誤:NodeJS 引導過程中的内部 JavaScript 源代碼導緻解析錯誤。 這是極其罕見的,通常隻能在 NodeJS 本身的開發過程中發生。3
-
内部 JavaScript 評估失敗:NodeJS 引導過程中的内部 JavaScript 源代碼在評估時未能傳回函數值。 這是極其罕見的,通常隻能在 NodeJS 本身的開發過程中發生。4
-
緻命錯誤:V8 中存在不可恢複的緻命錯誤。 通常将列印帶有字首5
的消息到标準錯誤。FATAL ERROR
-
非函數的内部異常句柄:存在未捕獲的異常,但内部緻命異常句柄不知何故設定為非函數,無法調用。6
-
内部異常句柄運作時失敗:存在未捕獲的異常,并且内部緻命異常句柄函數本身在嘗試處理時抛出錯誤。 例如,如果7
或'uncaughtException'
句柄抛出錯誤,就會發生這種情況。domain.on('error')
-
: 未使用。 在以前版本的 NodeJS 中,退出碼 8 有時表示未捕獲的異常。8
-
無效參數:指定了未知選項,或者提供了需要值的選項而沒有值。9
-
内部 JavaScript 運作時失敗:NodeJS 引導過程中的内部 JavaScript 源代碼在調用引導函數時抛出錯誤。 這是極其罕見的,通常隻能在 NodeJS 本身的開發過程中發生。10
-
無效的調試參數:設定了12
和/或--inspect
選項,但選擇的端口号無效或不可用。--inspect-brk
-
未完成的頂層等待:在頂層代碼中的函數外使用了13
,但傳入的await
從未解決。Promise
-
信号退出:如果 NodeJS 收到緻命的信号,例如>128
SIGKILL
,則其退出碼将是SIGHUP
加上信号代碼的值。 這是标準的 POSIX 實踐,因為退出碼被定義為 7 位整數,并且信号退出設定高位,然後包含信号代碼的值。 例如,信号128
的值是SIGABRT
,是以預期的退出碼将是6
+128
6
。134
總結
以上就是擷取 NodeJS 程式退出碼的方法以及退出碼枚舉。
~
~本文完,感謝閱讀!
學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!