天天看點

擷取 NodeJS 程式退出碼

擷取 NodeJS 程式退出碼

前言

想要退出正在運作的 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'

    事件句柄處理。
  • 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 程式退出碼的方法以及退出碼枚舉。

~

~本文完,感謝閱讀!

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

繼續閱讀