溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

NodeJS如何獲取程序退出碼

發(fā)布時(shí)間:2021-09-28 11:12:08 來(lái)源:億速云 閱讀:179 作者:小新 欄目:web開(kāi)發(fā)

這篇文章主要介紹NodeJS如何獲取程序退出碼,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

想要退出正在運(yùn)行的 NodeJS 程序,我們既可以通過(guò) Ctrl + C  的方式,也可以通過(guò) process.exit()來(lái)執(zhí)行退出。

這兩種操作都將強(qiáng)制進(jìn)程盡快退出,即使仍有未完全完成的異步操作掛起,包括對(duì) process.stdoutprocess.stderr 的 I/O 操作。

如果由于錯(cuò)誤情況需要終止 Node.js 進(jìn)程,則拋出未捕獲的錯(cuò)誤并允許進(jìn)程相應(yīng)地終止比調(diào)用 process.exit() 更安全,比如:

import process from 'process';

// 如何正確設(shè)置退出碼,同時(shí)讓進(jìn)程正常退出。
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exitCode = 1;
}

Worker 線程中,該函數(shù)停止當(dāng)前線程而不是當(dāng)前進(jìn)程。

那么對(duì)于一些意外退出的 NodeJS 程序,如何來(lái)獲取 exitCode ?每一個(gè)退出碼又代表什么?今天我們就來(lái)學(xué)習(xí)一下。

通過(guò) NodeJS 的 child_process 子進(jìn)程獲取退出碼

child_process.fork() 方法是 child_process.spawn() 的特例,專(zhuān)門(mén)用于衍生新的 NodeJS 進(jìn)程。

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);
});

子程序執(zhí)行參數(shù)

const fork = require('child_process').fork;

console.log('main ',process.argv);

const fs=require('fs');

const fd = fs.openSync('./a.log','a');

// 子程序參數(shù)
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退出碼

當(dāng)沒(méi)有更多異步操作掛起時(shí),NodeJS 通常會(huì)以 0 狀態(tài)代碼退出。 在其他情況下使用以下?tīng)顟B(tài)代碼:

  • 1 未捕獲的致命異常:存在未捕獲的異常,并且其沒(méi)有被域或 'uncaughtException' 事件句柄處理。

  • 2: 未使用(由 Bash 保留用于內(nèi)置誤用)

  • 3 內(nèi)部 JavaScript 解析錯(cuò)誤:NodeJS 引導(dǎo)過(guò)程中的內(nèi)部 JavaScript 源代碼導(dǎo)致解析錯(cuò)誤。 這是極其罕見(jiàn)的,通常只能在 NodeJS 本身的開(kāi)發(fā)過(guò)程中發(fā)生。

  • 4 內(nèi)部 JavaScript 評(píng)估失敗:NodeJS 引導(dǎo)過(guò)程中的內(nèi)部 JavaScript 源代碼在評(píng)估時(shí)未能返回函數(shù)值。 這是極其罕見(jiàn)的,通常只能在 NodeJS 本身的開(kāi)發(fā)過(guò)程中發(fā)生。

  • 5 致命錯(cuò)誤:V8 中存在不可恢復(fù)的致命錯(cuò)誤。 通常將打印帶有前綴 FATAL ERROR 的消息到標(biāo)準(zhǔn)錯(cuò)誤。

  • 6 非函數(shù)的內(nèi)部異常句柄:存在未捕獲的異常,但內(nèi)部致命異常句柄不知何故設(shè)置為非函數(shù),無(wú)法調(diào)用。

  • 7 內(nèi)部異常句柄運(yùn)行時(shí)失敗:存在未捕獲的異常,并且內(nèi)部致命異常句柄函數(shù)本身在嘗試處理時(shí)拋出錯(cuò)誤。 例如,如果 'uncaughtException'domain.on('error') 句柄拋出錯(cuò)誤,就會(huì)發(fā)生這種情況。

  • 8: 未使用。 在以前版本的 NodeJS 中,退出碼 8 有時(shí)表示未捕獲的異常。

  • 9 無(wú)效參數(shù):指定了未知選項(xiàng),或者提供了需要值的選項(xiàng)而沒(méi)有值。

  • 10 內(nèi)部 JavaScript 運(yùn)行時(shí)失敗:NodeJS 引導(dǎo)過(guò)程中的內(nèi)部 JavaScript 源代碼在調(diào)用引導(dǎo)函數(shù)時(shí)拋出錯(cuò)誤。 這是極其罕見(jiàn)的,通常只能在 NodeJS 本身的開(kāi)發(fā)過(guò)程中發(fā)生。

  • 12 無(wú)效的調(diào)試參數(shù):設(shè)置了 --inspect 和/或 --inspect-brk 選項(xiàng),但選擇的端口號(hào)無(wú)效或不可用。

  • 13 未完成的頂層等待:在頂層代碼中的函數(shù)外使用了 await,但傳入的 Promise 從未解決。

  • >128 信號(hào)退出:如果 NodeJS 收到致命的信號(hào),例如 SIGKILLSIGHUP,則其退出碼將是 128 加上信號(hào)代碼的值。 這是標(biāo)準(zhǔn)的 POSIX 實(shí)踐,因?yàn)橥顺龃a被定義為 7 位整數(shù),并且信號(hào)退出設(shè)置高位,然后包含信號(hào)代碼的值。 例如,信號(hào) SIGABRT 的值是 6,因此預(yù)期的退出碼將是 128 + 6134

以上是“NodeJS如何獲取程序退出碼”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI