process存在于全局对象上,无需使用require()加载即可使用。进程模块主要做了两件事。读:获取进程信息(资源使用情况、运行环境、运行状态)写:执行进程操作(监听事件、调度任务、发出警告)资源使用资源使用是指运行这个进程消耗的机器资源。比如内存,cpu内存process.memoryUsage()){rss:21848064,heapTotal:7159808,heapUsed:4431688,external:8224}rss(常驻内存)的组成如下图所示。代码段对应当前运行的代码外部对应C++对象占用的内存(绑定到V8管理的JS对象),比如使用BufferBuffer.allocUnsafe(1024*1024*1000);console.log(process.memoryUsage());{rss:22052864,heapTotal:6635520,heapUsed:4161376,external:1048584224}cpuconststartUsage=process.cpuUsage();console.log(startUsage);constnow=Date.now();while(Date.now()-now<500);控制台。日志(process.cpuUsage());console.log(process.cpuUsage(startUsage));//相对时间//{user:59459,system:18966}//{user:558135,system:22312}//{user:498432,system:3333}user对应用户时间,system代表系统时间.运行环境运行环境指本进程运行的主机环境,包括运行目录、节点环境、CPU架构、用户环境、系统平台运行目录console.log(`当前目录:${process.cwd()}`);//当前目录:/Users/xxxx/workspace/learn/node-basic/processnode环境console.log(process.version)//v9.1.0ifnotonly如果想获取node的版本信息,以及v8、zlib、libuv版本等信息,需要使用process.versions控制台。日志(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',战神:'1.13.0',模块:'59',nghttp2:'1.25.0',openssl:'1.0.2m',icu:'59.1',unicode:'9.0',cldr:'31.0.1',tz:'2017b'}cpuarchitectureconsole.log(`Thisprocessorarchitectureis${process.arch}`);//Thisprocessorarchitectureisx64Supportedvaluesinclude:'arm','arm64','ia32','mips','mipsel','ppc','ppc64','s390','s390x','x32''x64'用户环境console.log(process.env.NODE_ENV);//devNODE_ENV=dev除了nodeb.js启动时的自定义信息外,process.env还可以获取其他用户环境信息(如PATH、SHELL、HOME等)。有兴趣的可以自己打印出来试试系统平台console.log(`Thisplatformis${process.platform}`);这个平台是darwin支持的系统平台有:'aix''darwin''freebsd''linux''openbsd''sunos''win32'android还在实验阶段运行状态运行状态是指运行相关的信息当前进程的信息,包括启动参数、执行目录、主文件、PID信息、运行时间。获取启动参数的方式有3种,execArgv获取Node的命令行选项。argv获取非命令行选项的信息,argv0获取argv[0]的值(略有不同)console.log(process.argv)console.log(process.argv0)console.log(process.execArgv)node--harmonyb.jsfoo=bar--version//输出['/Users/xiji/.nvm/versions/node/v9.1.0/bin/node','/Users/xiji/workspace/learn/node-basic/process/b.js','foo=bar','--version']node['--harmony']执行目录console.log(process.execPath);///Users/xxxx/.nvm/versions/node/v9.1.0/bin/nodeuptimevardate=newDate();while(newDate()-date<500){}console.log(process.uptime());//0.569除了require.main,主文件还可以使用process.mainModule来判断一个模块是否是主文件//a.jsconsole.log(`moduleA:${process.mainModule===module}`);//b.jsrequire('./a');console.log(`moduleB:${process.mainModule===module}`);nodeb.js//输出模块A:falsemoduleB:truePID信息控制台。log(`这个进程是pid${process.pid}`);//这个进程是pid12554监听事件进程是EventEmiiter的一个实例对象,所以可以使用process.on('eventName',()=>{})来监听事件常用的事件类型分为两种:进程状态如:beforeExit、exit、uncaughtException,消息信号事件如:SIGTERM、SIGKILL、SIGUSR1beforeExit和exit的区别有两个方面:beforeExit可以执行异步代码,exit可以只有同步代码手动调用process.exit()或者触发uncaptException导致进程退出不会触发beforeExit事件,但是exit事件会触发。所以console下面的代码不会被执行{setTimeout(function(){console.log('exit:'+code);},0);});a.b();当异常没有被捕获和处理时,最后会触发'uncaughtException'事件。默认情况下,Node.js会将堆栈跟踪打印到stderr并退出进程。不要试图阻止uncaughtException退出进程,所以此时程序的状态可能不稳定。推荐的方式是及时捕获并处理代码中的错误,只对uncaughtException做一些清理工作。注意:node9.3版本增加了process.setUncaughtExceptionCaptureCallback方法。当process.setUncaughtExceptionCaptureCallback(fn)指定监听函数时,将不再触发uncaughtException事件。process.on('uncaughtException',function(){console.log('uncaughtlistener');});process.setUncaughtExceptionCaptureCallback(function(){console.log('uncaughtfn');});a.b();//uncaughtfnmessage适用于父子进程之间发送消息,如何创建父子进程将在child_process模块??中进行。虽然SIGTERM信号也用于请求终止Node.js进程,但它与SIGKILL不同。进程可以选择响应或忽略这个信号。SIGTERM会以友好的方式结束进程,并在进程结束前释放已分配的资源(如数据库连接),因此这种方式称为优雅关机(gracefulshutdown)。具体执行步骤如下:应用关闭通知需要关闭(收到SIGTERM信号)应用通知负载均衡器不再接收新请求应用完成正在进行的请求释放资源(如数据库连接)应用程序正常退出,退出状态码为0SIGUSR1Node.js当收到SIGUSR1信号执行时会启动内置调试器。当执行以下操作时,kill-USR1PID_OF_THE_NODE_JS_PROCESS可以看到node.js会启动debugger代理,端口为9229serverislistening8089Debuggerlisteningonws://127.0.0.1:9229/7ef98ccb-02fa-451a-8954-4706bd74105f帮助参见:https://nodejs.org/en/docs/inspector也可以在服务启动时使用--inspect来启动调试代理节点--inspectindex.js调度任务进程。nextTick(fn)通过process.nextTick调度的任务是一个异步任务。EventLoop是分阶段的,每个阶段执行一个特定的任务,而在阶段切换的时候会执行nextTick的任务,所以nextTick会比setTimeout(fn,0)执行得更快,EventLoop见下图,更进一步后面会详细解释发出警告process.emitWarning('Somethingwarninghappened!',{code:'MY_WARNING',type:'XXXX'});//(node:14771)[MY_WARNING]XXXX:Somethingwarning发生了!当type为DeprecationWarning时,可以受命令行选项的影响--throw-deprecation会抛出异常--no-deprecation不输出DeprecationWarning--trace-deprecation打印详细的堆栈信息process.emitWar宁('发生警告!',{类型:'DeprecationWarning'});console.log(4);node--throw-deprecationindex.jsnode--no-deprecationindex.jsnode--trace-deprecationindex.js
