前言
想要退出正在執行的 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 通常會以 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 收到致命的訊號,例如SIGKILL
或SIGHUP
,則其退出碼將是128
加上訊號程式碼的值。 這是標準的 POSIX 實踐,因為退出碼被定義為 7 位整數,並且訊號退出設定高位,然後包含訊號程式碼的值。 例如,訊號SIGABRT
的值是6
,因此預期的退出碼將是128
+6
或134
。
總結
以上就是獲取 NodeJS 程式退出碼的方法以及退出碼列舉。
~
~本文完,感謝閱讀!
~
學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!
大家好,我是〖程式設計三昧〗的作者 隱逸王,我的公眾號是『程式設計三昧』,歡迎關注,希望大家多多指教!
你來,懷揣期望,我有墨香相迎! 你歸,無論得失,唯以餘韻相贈!
知識與技能並重,內力和外功兼修,理論和實踐兩手都要抓、兩手都要硬!
本作品採用《CC 協議》,轉載必須註明作者和本文連結