獲取 NodeJS 程式退出碼

程式設計三昧發表於2021-08-23

前言

想要退出正在執行的 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 程式退出碼的方法以及退出碼列舉。

~

~本文完,感謝閱讀!

~

學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!

大家好,我是〖程式設計三昧〗的作者 隱逸王,我的公眾號是『程式設計三昧』,歡迎關注,希望大家多多指教!

你來,懷揣期望,我有墨香相迎! 你歸,無論得失,唯以餘韻相贈!

知識與技能並重,內力和外功兼修,理論和實踐兩手都要抓、兩手都要硬!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章