摘要:默認(rèn)情況下,會(huì)打印堆棧信息到然后退出進(jìn)程。適用于父子進(jìn)程之間發(fā)送消息,關(guān)于如何創(chuàng)建父子進(jìn)程會(huì)放在模塊中進(jìn)行。信號(hào)雖然也是用于請(qǐng)求終止進(jìn)程,但是它與有所不同,進(jìn)程可以選擇響應(yīng)還是忽略此信號(hào)。
process存在于全局對(duì)象上,不需要使用require()加載即可使用,process模塊主要做兩方面的事情
讀:獲取進(jìn)程信息(資源使用、運(yùn)行環(huán)境、運(yùn)行狀態(tài))
寫:執(zhí)行進(jìn)程操作(監(jiān)聽事件、調(diào)度任務(wù)、發(fā)出警告)
資源使用資源使用指運(yùn)行此進(jìn)程所消耗的機(jī)器資源。例如內(nèi)存、cpu
內(nèi)存process.memoryUsage()) { rss: 21848064, heapTotal: 7159808, heapUsed: 4431688, external: 8224 }
rss(常駐內(nèi)存)的組成見下圖
code segment對(duì)應(yīng)當(dāng)前運(yùn)行的代碼
external對(duì)應(yīng)的是C++對(duì)象(與V8管理的JS對(duì)象綁定)的占用的內(nèi)存,比如Buffer的使用
Buffer.allocUnsafe(1024 * 1024 * 1000); console.log(process.memoryUsage()); { rss: 22052864, heapTotal: 6635520, heapUsed: 4161376, external: 1048584224 }cpu
const startUsage = process.cpuUsage(); console.log(startUsage); const now = Date.now(); while (Date.now() - now < 500); console.log(process.cpuUsage()); console.log(process.cpuUsage(startUsage)); //相對(duì)時(shí)間 // { user: 59459, system: 18966 } // { user: 558135, system: 22312 } // { user: 498432, system: 3333 }
user對(duì)應(yīng)用戶時(shí)間,system代表系統(tǒng)時(shí)間
運(yùn)行環(huán)境運(yùn)行環(huán)境指此進(jìn)程運(yùn)行的宿主環(huán)境包括運(yùn)行目錄、node環(huán)境、CPU架構(gòu)、用戶環(huán)境、系統(tǒng)平臺(tái)
運(yùn)行目錄console.log(`Current directory: ${process.cwd()}`); // Current directory: /Users/xxxx/workspace/learn/node-basic/processnode環(huán)境
console.log(process.version) // v9.1.0
如果不僅僅希望獲得node的版本信息,還希望v8、zlib、libuv版本等信息的話就需要使用process.versions了
console.log(process.versions); { http_parser: "2.7.0", node: "9.1.0", v8: "6.2.414.32-node.8", uv: "1.15.0", zlib: "1.2.11", ares: "1.13.0", modules: "59", nghttp2: "1.25.0", openssl: "1.0.2m", icu: "59.1", unicode: "9.0", cldr: "31.0.1", tz: "2017b" }cpu架構(gòu)
console.log(`This processor architecture is ${process.arch}`); // This processor architecture is x64
支持的值包括:"arm", "arm64", "ia32", "mips", "mipsel", "ppc", "ppc64", "s390", "s390x", "x32" "x64"
用戶環(huán)境console.log(process.env.NODE_ENV); // dev NODE_ENV=dev node b.js
除了啟動(dòng)時(shí)的自定義信息之外,process.env還可以獲得其他的用戶環(huán)境信息(比如PATH、SHELL、HOME等),感興趣的可以自己打印一下試試
系統(tǒng)平臺(tái)console.log(`This platform is ${process.platform}`); This platform is darwin
支持的系統(tǒng)平臺(tái)包括:"aix" "darwin" "freebsd" "linux" "openbsd" "sunos" "win32"
android目前還處于試驗(yàn)階段
運(yùn)行狀態(tài)運(yùn)行狀態(tài)指當(dāng)前進(jìn)程的運(yùn)行相關(guān)的信息包括啟動(dòng)參數(shù)、執(zhí)行目錄、主文件、PID信息、運(yùn)行時(shí)間
啟動(dòng)參數(shù)獲取啟動(dòng)參數(shù)有三個(gè)方法,execArgv獲取Node.js的命令行選項(xiàng)(見官網(wǎng)文檔)
argv獲取非命令行選項(xiàng)的信息,argv0則獲取argv[0]的值(略有差異)
console.log(process.argv) console.log(process.argv0) console.log(process.execArgv) node --harmony b.js foo=bar --version // 輸出結(jié)果 [ "/Users/xiji/.nvm/versions/node/v9.1.0/bin/node", "/Users/xiji/workspace/learn/node-basic/process/b.js", "foo=bar", "--version" ] node [ "--harmony" ]執(zhí)行目錄
console.log(process.execPath); // /Users/xxxx/.nvm/versions/node/v9.1.0/bin/node運(yùn)行時(shí)間
var date = new Date(); while(new Date() - date < 500) {} console.log(process.uptime()); // 0.569主文件
除了require.main之外也可以通過process.mainModule來判斷一個(gè)模塊是否是主文件
//a.js console.log(`module A: ${process.mainModule === module}`); //b.js require("./a"); console.log(`module B: ${process.mainModule === module}`); node b.js // 輸出 module A: false module B: true
PID信息
console.log(`This process is pid ${process.pid}`); //This process is pid 12554監(jiān)聽事件
process是EventEmiiter的實(shí)例對(duì)象,因此可以使用process.on("eventName", () => {})來監(jiān)聽事件。
常用的事件類型分兩種:
進(jìn)程狀態(tài) 比如:beforeExit、exit、uncaughtException、message
信號(hào)事件 比如:SIGTERM、SIGKILL、SIGUSR1
beforeExit與exit的區(qū)別有兩方面:
beforeExit里面可以執(zhí)行異步代碼、exit只能是同步代碼
手動(dòng)調(diào)用process.exit()或者觸發(fā)uncaptException導(dǎo)致進(jìn)程退出不會(huì)觸發(fā)beforeExit事件、exit事件會(huì)觸發(fā)。
因此下面的代碼console都不會(huì)被執(zhí)行
process.on("beforeExit", function(code) { console.log("before exit: "+ code); }); process.on("exit", function(code) { setTimeout(function() { console.log("exit: " + code); }, 0); }); a.b();
當(dāng)異常一直沒有被捕獲處理的話,最后就會(huì)觸發(fā)"uncaughtException"事件。默認(rèn)情況下,Node.js會(huì)打印堆棧信息到stderr然后退出進(jìn)程。不要試圖阻止uncaughtException退出進(jìn)程,因此此時(shí)程序的狀態(tài)可能已經(jīng)不穩(wěn)定了,建議的方式是及時(shí)捕獲處理代碼中的錯(cuò)誤,uncaughtException里面只做一些清理工作。
注意:node的9.3版本增加了process.setUncaughtExceptionCaptureCallback方法
當(dāng)process.setUncaughtExceptionCaptureCallback(fn)指定了監(jiān)聽函數(shù)的時(shí)候,uncaughtException事件將會(huì)不再被觸發(fā)。
process.on("uncaughtException", function() { console.log("uncaught listener"); }); process.setUncaughtExceptionCaptureCallback(function() { console.log("uncaught fn"); }); a.b(); // uncaught fn
message適用于父子進(jìn)程之間發(fā)送消息,關(guān)于如何創(chuàng)建父子進(jìn)程會(huì)放在child_process模塊中進(jìn)行。
SIGTERM信號(hào)雖然也是用于請(qǐng)求終止Node.js進(jìn)程,但是它與SIGKILL有所不同,進(jìn)程可以選擇響應(yīng)還是忽略此信號(hào)。
SIGTERM會(huì)以一種友好的方式來結(jié)束進(jìn)程,在進(jìn)程結(jié)束之前先釋放已分配的資源(比如數(shù)據(jù)庫連接),因此這種方式被稱為優(yōu)雅關(guān)閉(graceful shutdown)
具體的執(zhí)行步驟如下:
應(yīng)用程序被通知需要關(guān)閉(接收到SIGTERM信號(hào))
應(yīng)用程序通知負(fù)載均衡不再接收新的請(qǐng)求
應(yīng)用程序完成正在進(jìn)行中的請(qǐng)求
釋放資源(例如數(shù)據(jù)庫連接)
應(yīng)用程序正常退出,退出狀態(tài)碼為0
SIGUSR1
Node.js當(dāng)接收到SIGUSR1信號(hào)時(shí)會(huì)啟動(dòng)內(nèi)置的調(diào)試器,當(dāng)執(zhí)行下列操作時(shí)
kill -USR1 PID_OF_THE_NODE_JS_PROCESS
可以看到node.js會(huì)啟動(dòng)調(diào)試器代理,端口是9229
server is listening 8089 Debugger listening on ws://127.0.0.1:9229/7ef98ccb-02fa-451a-8954-4706bd74105f For help, see: https://nodejs.org/en/docs/inspector
也可以在服務(wù)啟動(dòng)時(shí)使用--inspect 來啟動(dòng)調(diào)試代理
node --inspect index.js調(diào)度任務(wù)
process.nextTick(fn)
通過process.nextTick調(diào)度的任務(wù)是異步任務(wù),EventLoop是分階段的,每個(gè)階段執(zhí)行特定的任務(wù),而nextTick的任務(wù)在階段切換的時(shí)候就會(huì)執(zhí)行,因此nextTick會(huì)比setTimeout(fn, 0)更快的執(zhí)行,關(guān)于EventLoop見下圖,后面會(huì)做進(jìn)一步詳細(xì)的講解
process.emitWarning("Something warning happened!", { code: "MY_WARNING", type: "XXXX" }); // (node:14771) [MY_WARNING] XXXX: Something warning happened!
當(dāng)type為DeprecationWarning時(shí),可以通過命令行選項(xiàng)施加影響
--throw-deprecation 會(huì)拋出異常
--no-deprecation 不輸出DeprecationWarning
--trace-deprecation 打印詳細(xì)堆棧信息
process.emitWarning("Something warning happened!", { type: "DeprecationWarning" }); console.log(4); node --throw-deprecation index.js node --no-deprecation index.js node --trace-deprecation index.js
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107838.html
摘要:而且方式創(chuàng)建的子進(jìn)程與父進(jìn)程之間建立了通信管道,因此子進(jìn)程和父進(jìn)程之間可以通過的方式發(fā)送消息。與事件的回調(diào)函數(shù)有兩個(gè)參數(shù)和,代碼子進(jìn)程最終的退出碼,如果子進(jìn)程是由于接收到信號(hào)終止的話,會(huì)記錄子進(jìn)程接受的值。 在介紹child_process模塊之前,先來看一個(gè)下面的代碼。 const http = require(http); const longComputation = () =>...
摘要:先把當(dāng)成文件,依次查找當(dāng)前目錄下的,找到了,就返回該文件,不再繼續(xù)執(zhí)行。那么關(guān)于正確的結(jié)論是在中使用是跟的效果相同,不會(huì)因?yàn)閱?dòng)腳本的目錄不一樣而改變,在其他情況下跟效果相同,是相對(duì)于啟動(dòng)腳本所在目錄的路徑。 起因 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同進(jìn)步,以學(xué)習(xí)者的身份寫博...
摘要:先把當(dāng)成文件,依次查找當(dāng)前目錄下的,找到了,就返回該文件,不再繼續(xù)執(zhí)行。那么關(guān)于正確的結(jié)論是在中使用是跟的效果相同,不會(huì)因?yàn)閱?dòng)腳本的目錄不一樣而改變,在其他情況下跟效果相同,是相對(duì)于啟動(dòng)腳本所在目錄的路徑。 起因 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同進(jìn)步,以學(xué)習(xí)者的身份寫博...
摘要:在前后端分離的前端項(xiàng)目開發(fā)中經(jīng)常用到。是的一個(gè)中間件。即是一個(gè)重要的功能。配置先來在配置文件中引入添加一個(gè)和通信的客戶端添加應(yīng)用入口文件在插件中引入在我們的開發(fā)環(huán)境中是這樣配置的。 原文鏈接此文是我同事寫的,搭建Express結(jié)合Webpack。以下是正文,后面我會(huì)附上我的解讀 Express 結(jié)合 Webpack 實(shí)現(xiàn)HMR 本篇文件主要講結(jié)合 Webpack 和 Express 實(shí)...
閱讀 2482·2021-11-17 09:33
閱讀 767·2021-11-04 16:13
閱讀 1339·2021-10-14 09:50
閱讀 704·2019-08-30 15:53
閱讀 3673·2019-08-30 14:18
閱讀 3276·2019-08-30 14:14
閱讀 2108·2019-08-30 12:46
閱讀 3190·2019-08-26 14:05