欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何主動終止Node.js進程

這篇文章主要介紹了如何主動終止Node.js進程,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供市中企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、成都做網(wǎng)站、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為市中眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進行中。

js的作用是什么

1、能夠嵌入動態(tài)文本于HTML頁面。2、對瀏覽器事件做出響應(yīng)。3、讀寫HTML元素。4、在數(shù)據(jù)被提交到服務(wù)器之前驗證數(shù)據(jù)。5、檢測訪客的瀏覽器信息。6、控制cookies,包括創(chuàng)建和修改等。7、基于Node.js技術(shù)進行服務(wù)器端編程。

有幾個原因會導致 Node.js 進程終止。其中一些是可以避免的,例如拋出錯誤時,而另一些是無法防止的,例如內(nèi)存不足。全局 process 是一個 Event Emitter 實例,當執(zhí)行正常退出時,將發(fā)出一個 exit 事件。然后程序代碼可以通過偵聽這個事件來執(zhí)行最后的同步清理工作。

下面是可以主動觸發(fā)進程終止的一些方法:

操作例子
手動流程退出process.exit(1)
未捕獲的異常throw new Error()
未兌現(xiàn)的 promisePromise.reject()
忽略的錯誤事件EventEmitter#emit('error')
未處理的信號$ kill <PROCESS_ID>

其中有許多是屬于偶然被觸發(fā)的,例如未捕獲的錯誤或未處理的 promise,但是其中也有為了直接使進程終止而創(chuàng)建的。

進程退出

使用 process.exit(code) 來終止進程是最直接的方法。這在當你知道自己的過程已經(jīng)到了生命周期的盡頭時非常有用。  code 值是可選的,默認值為0,最大可以設(shè)為 255。0 表示進程運行成功,而任何非零的數(shù)字都表示發(fā)生了問題。這些值可以被許多不同的外部工具使用。例如當測試套件運行時,非零值表示測試失敗。

直接調(diào)用 process.exit() 時,不會向控制臺寫入任何隱式文本。如果你編寫了以錯誤表示形式調(diào)用此方法的代碼,則你的代碼應(yīng)該用戶輸出錯誤來幫助他們解決問題。例如運行以下代碼:

$ node -e "process.exit(42)"
$ echo $?

在這種情況下,單行的 Node.js 程序不會輸出任何信息,盡管 shell 程序確實會打印退出狀態(tài)。遇到這樣的進程退出,用戶將無法理解究竟發(fā)生了什么事情。所以要參考下面這段程序配置錯誤時會執(zhí)行的代碼:

function checkConfig(config) {
  if (!config.host) {
    console.error("Configuration is missing 'host' parameter!");
    process.exit(1);
  }
}

在這種情況下,用戶沒會很清楚發(fā)生了什么。他們運行這個程序,將錯誤輸出到控制臺上,并且他們能夠糾正這個問題。

process.exit() 方法非常強大。盡管它在程序代碼中有自己的用途,但實際上絕對不應(yīng)該將其引入可重用的庫中。如果在庫中確實發(fā)生了錯誤,則應(yīng)拋出這個錯誤,以便程序可以決定應(yīng)該如何處理它。

exceprion、rejection 和發(fā)出的 Error

雖然 process.exit() 很有用,但對于運行時錯誤,你需要使用其他工具。例如當程序正在處理 HTTP 請求時,一般來說錯誤不應(yīng)該終止進程,而是僅返回錯誤響應(yīng)。發(fā)生錯誤的位置信息也很有用,這正是應(yīng)該拋出 Error 對象的地方。

Error 類的實例包含對導致錯誤的原因有用的元數(shù)據(jù),例如棧跟蹤信息和消息字符串。從 Error 擴展你自己的錯誤類是很常見的操作。單獨實例化 Error 不會有太多副作用,如果發(fā)生錯誤則必須拋出。

在使用 throw 關(guān)鍵字或發(fā)生某些邏輯錯誤時,將引發(fā) Error。發(fā)生這種情況時,當前棧將會“展開”,這意味著每個函數(shù)都會退出,直到一個調(diào)用函數(shù)將調(diào)用包裝在 try/catch 語句中為止。遇到此語句后,將調(diào)用 catch 分支。如果錯誤沒有被包含在 try/catch 中,則該錯誤被視為未捕獲。

雖然你應(yīng)該使用帶有 Errorthrow 關(guān)鍵字,例如 throw new Error('foo'),但從技術(shù)上講,你可以拋出任何東西。一旦拋出了什么東西,它就被認為是一個例外。拋出 Error 實例非常重要,因為捕獲這些錯誤的代碼很可能會期望得到錯誤屬性。

Node.js 內(nèi)部庫中常用的另一種模式是提供一個 .code 屬性,該屬性是一個字符串值,在發(fā)行版之間應(yīng)保持一致。比如錯誤的 .code 值是 ERR_INVALID_URI,即使是供人類可讀的 .message 屬性可能會更改,但這個 code 值也不應(yīng)被更改。

可悲的是,一種更常用的區(qū)分錯誤的模式是檢查 .message 屬性,這個屬性通常是動態(tài)的,因為可能回需要修改拼寫錯誤。這種方法是很冒險的,也是容易出錯的。 Node.js 生態(tài)中沒有完美的解決方案來區(qū)分所有庫中的錯誤。

當引發(fā)未捕獲的錯誤時,控制臺中將打印棧跟蹤信息,并且進程將回以退出狀態(tài) 1 終止。這是此類異常的例子:

/tmp/foo.js:1
throw new TypeError('invalid foo');
^
Error: invalid foo
    at Object.<anonymous> (/tmp/foo.js:2:11)
    ... TRUNCATED ...
    at internal/main/run_main_module.js:17:47

上面的棧跟蹤片段表明錯誤發(fā)生在名為 foo.js 的文件的第 2 行第 11 列。

全局的 process 是一個事件發(fā)射器,可以通過偵聽 uncaughtException 事件來攔截未捕獲的錯誤。下面是一個使用它的例子,在退出前攔截錯誤以發(fā)送異步消息:

const logger = require('./lib/logger.js');
process.on('uncaughtException', (error) => {
  logger.send("An uncaught exception has occured", error, () => {
    console.error(error);
    process.exit(1);
  });
});

Promise 拒絕與拋出錯誤非常相似。如果 Promise 中的 reject() 方法被調(diào)用,或者在異步函數(shù)中引發(fā)了錯誤,則 Promise 可以拒絕。在這方面,以下兩個例子大致相同:

Promise.reject(new Error('oh no'));

(async () => {
  throw new Error('oh no');
})();

這是輸出到控制臺的消息:

(node:52298) UnhandledPromiseRejectionWarning: Error: oh no
    at Object.<anonymous> (/tmp/reject.js:1:16)
    ... TRUNCATED ...
    at internal/main/run_main_module.js:17:47
(node:52298) UnhandledPromiseRejectionWarning: Unhandled promise
  rejection. This error originated either by throwing inside of an
  async function without a catch block, or by rejecting a promise
  which was not handled with .catch().

與未捕獲的異常不同,從 Node.js v14 開始,這些 rejection 不會使進程崩潰。在未來的 Node.js 版本中,會使當前進程崩潰。當這些未處理的 rejection 發(fā)生時,你還可以攔截事件,偵聽 process 對象上的另一個事件:

process.on('unhandledRejection', (reason, promise) => {});

事件發(fā)射器是 Node.js 中的常見模式,許多對象實例都從這個基類擴展而來,并在庫和程序中使用。它們非常歡迎,值得和 error 與 rejection 放在一起討論。

當事件發(fā)射器發(fā)出沒有偵聽器的 error 事件時,將會拋出所發(fā)出的參數(shù)。然后將拋出出一個錯誤并導致進程退出:

events.js:306
    throw err; // Unhandled 'error' event
    ^
Error [ERR_UNHANDLED_ERROR]: Unhandled error. (undefined)
    at EventEmitter.emit (events.js:304:17)
    at Object.<anonymous> (/tmp/foo.js:1:40)
    ... TRUNCATED ...
    at internal/main/run_main_module.js:17:47 {
  code: 'ERR_UNHANDLED_ERROR',
  context: undefined
}

確保在你使用的事件發(fā)射器實例中偵聽 error 事件,以便你的程序可以正常處理事件而不會崩潰。

信號

信號是操作系統(tǒng)提供的機制,用于把用數(shù)字表示的消息從一個程序發(fā)送到另一個程序。這些數(shù)字通常用等價的常量字符串來表示。例如,信號 SIGKILL 代表數(shù)字信號 9。信號可以有不同的用途,但通常用于終止程序。

不同的操作系統(tǒng)可以定義不同的信號,但是下面列表中的信號一般是通用的:

名稱編號可處理Node.js 默認信號用途
SIGHUP1終止父終端已關(guān)閉
SIGINT2終止終端試圖中斷,按下 Ctrl + C
SIGQUIT3終止終端試圖退出,按下 Ctrl + D
SIGKILL9終止進程被強行殺死
SIGUSR110啟動調(diào)試器用戶定義的信號1
SIGUSR212終止用戶定義的信號2
SIGTERM12終止代表優(yōu)雅的終止
SIGSTOP19終止進程被強行停止

如果程序可以選擇實現(xiàn)信號處理程序,則 Handleable 一列則為。為的兩個信號無法處理。 Node.js 默認 這一列告訴你在收到信號時,Node.js 程序的默認操作是什么。最后一個信號用途指出了信號對應(yīng)的作用。

在 Node.js 程序中處理這些信號可以通過偵聽 process 對象上的更多事件來完成:

#!/usr/bin/env node
console.log(`Process ID: ${process.pid}`);
process.on('SIGHUP', () => console.log('Received: SIGHUP'));
process.on('SIGINT', () => console.log('Received: SIGINT'));
setTimeout(() => {}, 5 * 60 * 1000); // keep process alive

在終端窗口中運行這個程序,然后按 Ctrl + C,這個進程不會被終止。它將會聲明已接收到 SIGINT 信號。切換到另一個終端窗口,并根據(jù)輸出的進程 ID 值執(zhí)行以下命令:

$ kill -s SIGHUP <PROCESS_ID>

這演示了一個程序怎樣向另一個程序發(fā)送信號,并且在第一個終端中運行的 Node.js 程序中輸出它所接收到的 SIGHUP 信號。

你可能已經(jīng)猜到了,Node.js 也能把命令發(fā)送到其他程序??梢杂孟旅娴拿钜园研盘枏呐R時的 Node.js 進程發(fā)送到你現(xiàn)有的進程:

$ node -e "process.kill(<PROCESS_ID>, 'SIGHUP')"

這還會在你的第一個程序中顯示 SIGHUP 消息?,F(xiàn)在,如果你想終止第一個進程,要運行下面的命令向其發(fā)送不能處理的 SIGKILL 信號:

$ kill -9 <PROCESS_ID>

這時程序應(yīng)該結(jié)束。

這些信號在 Node.js 程序中經(jīng)常用于處理正常的關(guān)閉事件。例如,當 Kubernetes Pod 終止時,它將向程序發(fā)送 SIGTERM 信號,之后啟動 30 秒計時器。然后程序可以在這 30 秒內(nèi)正常關(guān)閉自己,關(guān)閉連接并保存數(shù)據(jù)。如果該進程在此計時器后仍保持活動狀態(tài),則 Kubernetes 將向其發(fā)送一個 SIGKILL。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何主動終止Node.js進程”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!

網(wǎng)站欄目:如何主動終止Node.js進程
鏈接分享:http://chinadenli.net/article24/iegpje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站導航網(wǎng)頁設(shè)計公司、網(wǎng)站設(shè)計公司、網(wǎng)站策劃App設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
亚洲视频一区二区久久久| 色一情一乱一区二区三区码| 亚洲欧美日韩国产综合在线 | 国产一区二区三区免费福利| 日本不卡一本二本三区| 日本精品中文字幕在线视频| 久久福利视频这里有精品| 91亚洲国产日韩在线| 97人摸人人澡人人人超碰| 99久久精品国产麻豆| 俄罗斯胖女人性生活视频| 国产精品二区三区免费播放心 | 老司机精品线观看86| 日本高清一道一二三区四五区| 99少妇偷拍视频在线| 美女激情免费在线观看| 欧美欧美欧美欧美一区| 日韩中文字幕狠狠人妻| 日本少妇中文字幕不卡视频| 四季av一区二区播放| 欧美日韩国产自拍亚洲| 99久久国产亚洲综合精品| 久草热视频这里只有精品| 日韩熟妇人妻一区二区三区| 精品国模一区二区三区欧美| 亚洲欧洲一区二区中文字幕| 日韩高清中文字幕亚洲| 黄片免费播放一区二区| 成人精品欧美一级乱黄| 中文字幕在线区中文色| 91插插插外国一区二区婷婷| a久久天堂国产毛片精品| 青青操成人免费在线视频| 加勒比系列一区二区在线观看 | 福利视频一区二区三区| 1024你懂的在线视频| 欧美韩国日本精品在线| 偷拍偷窥女厕一区二区视频| 中文字幕一区二区久久综合| 国产又粗又猛又爽又黄| 久久青青草原中文字幕|