本文深入解析Node.js中的Process模块,介绍其作为全局对象访问进程信息的方法。详细阐述标准I/O管道的读写机制、操作系统信号(如SIGTERM、SIGINT)的监听与处理,以及abort、exit、kill等进程控制函数的具体用法,帮助开发者更好地管理Node.js应用生命周期。
前文已提及Node.js应用默认在单线程环境中运行,然而现代服务器通常配备多处理器核心。为充分利用多核资源,Node.js提供了三个关键模块:Process模块用于访问当前运行的进程信息;child_process模块负责创建子进程并实现通信;cluster模块则支持构建共享同一端口的集群服务,以并发处理多个请求。
一、Process模块
Process模块是一个全局对象,无需通过require()引入即可在Node.js应用程序中直接访问。
二、进程I/O管道
Process模块提供了对标准输入输出管道的访问接口,包括stdin、stdout和stderr,其功能类似于C++中的标准输入输出流。
通过stdin可以接收输入,利用stdout和stderr则可实现程序输出。
/**
* Created by Administrator on 2016/3/29.
*/
process.stdin.on('data',function(data){
process.stdout.write(data.toString());
process.stderr.write(data.toString());
});运行上述代码后的输出结果如下所示:
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe Process.js
ssss
ssss
ssss三、进程的信号
此处提到的信号与信号量概念不同,尽管二者名称相似,但功能机制有所区别。
信号量主要支持等待和发送信号两种操作,即P(sv)和V(sv),其具体行为表现如下:
信号量仅支持等待和发送信号两种操作,即P(sv)和V(sv),其具体行为表现如下:
执行P(sv)操作时,若信号量sv的值大于零,则将其减1;若值为零,则挂起当前进程的执行。
执行V(sv)操作时,若有其他进程因等待该信号量而被挂起,则恢复其运行;若无进程等待,则将信号量值加1。
当两个进程共享信号量sv时,若其中一个进程执行P(sv)操作,它将获得信号量并进入临界区,使sv减1。此时,第二个进程因试图执行P(sv)且sv为0而被阻止进入临界区,处于挂起状态,直到第一个进程离开临界区并执行V(sv)释放信号量,第二个进程方可恢复执行。
Node.js允许注册事件监听器以处理操作系统发送给进程的信号。Node.js进程可接收的信号事件包括以下几种:
SIGUSR1:在启动调试器时发出该信号。
SIGPIPE:当进程试图写入另一端无连接进程的管道时发出。
SIGHUP:在Windows控制台中关闭窗口时发出。发出此事件约10秒后,Node.js进程将终止。
SIGTERM:在收到终止进程请求时发出。注意,Windows系统不支持此信号。
SIGINT:当中断信号发送至进程时发出,例如按下Ctrl+C组合键时触发。
SIGBREAK:在Windows系统下按下Ctrl+Break组合键时发出。
SIGWINCE:当控制台窗口大小被调整时发出。在Windows环境下,仅当向控制台写入、移动光标或使用原始模式下的可读TTY时才会触发。
SIGKILL:当进程被强制杀死时发出该信号。
SIGSTOP:当进程被停止时发出该信号。
除了上述信号外,Process模块的on方法定义中还可监听exit、uncaughtException等事件(可通过查看源码定义确认)。
四、控制进程执行
abort():使当前Node.js应用程序触发abort事件并退出,同时生成内存核心转储文件。
exit([code]):使当前Node.js应用退出,并返回指定的退出码code。
kill(pid,[signall]):操作系统向指定pid的进程发送kill信号,默认发送SIGTERM信号。
nexttick(callback):将callback函数调度到Node.js程序的队列中执行。
五、从Process模块获取信息
var util = require('util');
//返回进程的当前工作目录
console.log('Current directory: ' + process.cwd());
//该进程的环境中指定的键/值对
console.log('Environment Settings: ' + JSON.stringify(process.env));
//用于启动Node.js应用程序的命令参数
console.log('Node Args: ' + process.argv);
//Node。js从中启动的绝对路径
console.log('Execution Path: ' + process.execPath);
//用于启动应用程序的特定节点的命令行选项
console.log('Execution Args: ' + JSON.stringify(process.execArgv));
//Node.js版本号
console.log('Node Version: ' + process.version);
//提供一个对象,包含Node.js应用程序所需的模块和版本
console.log('Module Versions: ' + JSON.stringify(process.versions));
//用于编译当前节点可执行程序的配置选项
console.log('Node Config: ' + JSON.stringify(process.config));
//当前进程ID
console.log('Process ID: ' + process.pid);
//当前进程标题
console.log('Process Title: ' + process.title);
//操作系统
console.log('Process Platform: ' + process.platform);
//进程正在运行的处理器体系结构
console.log('Process Architecture: ' + process.arch);
//Node.js进程的当前内存使用情况可使用util.inspect()读取
console.log('Memory Usage: ' + util.inspect(process.memoryUsage()));
//返回一个高精确的时间
var start = process.hrtime();
setTimeout(function() {
var delta = process.hrtime(start);
console.log('High-Res timer took %d seconds and %d nanoseconds',
delta[0], + delta[1]);
console.log('Node has been running %d seconds', process.uptime());
}, 1000);运行上述代码获取进程信息后的输出结果如下:
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe process_info.js
Current directory: c:\Users\Administrator\Desktop\nodejs-mongodb-angularjs-web-development-master\ch09
Environment Settings: {"#envTSLOGTSLOG11328":"100839136","ALLUSERSPROFILE":"C:\\ProgramData","APPDATA":"C:\\Users\\Administrator\\AppData\\Roaming","asl.log":"Destination=file","CommonProgramFiles":"C:\\Program Files\\Common Files","CommonProgramFiles(x86)":"C:\\Program Files (x86)\\Common Files","CommonProgramW6432":"C:\\Program Files\\Common Files","COMPUTERNAME":"LENOVO-PC","ComSpec":"C:\\WINDOWS\\system32\\cmd.exe","configsetroot":"C:\\WINDOWS\\ConfigSetRoot","FPS_BROWSER_APP_PROFILE_STRING":"Internet Explorer","FPS_BROWSER_USER_PROFILE_STRING":"Default","FP_NO_HOST_CHECK":"NO","HOMEDRIVE":"C:","HOMEPATH":"\\Users\\Administrator","LOCALAPPDATA":"C:\\Users\\Administrator\\AppData\\Local","LOGONSERVER":"\\\\MicrosoftAccount","NUMBER_OF_PROCESSORS":"4","OS":"Windows_NT","Path":"C:\\PROGRAM FILES (X86)\\INTEL\\ICLS CLIENT\\;C:\\PROGRAM FILES\\INTEL\\ICLS CLIENT\\;C:\\WINDOWS\\SYSTEM32;C:\\WINDOWS;C:\\WINDOWS\\SYSTEM32\\WBEM;C:\\WINDOWS\\SYSTEM32\\WINDOWSPOWERSHELL\\V1.0\\;C:\\PROGRAM FILES\\INTEL\\INTEL(R) MANAGEMENT ENGINE COMPONENTS\\DAL;C:\\PROGRAM FILES\\INTEL\\INTEL(R) MANAGEMENT ENGINE COMPONENTS\\IPT;C:\\PROGRAM FILES (X86)\\INTEL\\INTEL(R) MANAGEMENT ENGINE COMPONENTS\\DAL;C:\\PROGRAM FILES (X86)\\INTEL\\INTEL(R) MANAGEMENT ENGINE COMPONENTS\\IPT;C:\\PROGRAM FILES (X86)\\ATI TECHNOLOGIES\\ATI.ACE\\CORE-STATIC;;C:\\WINDOWS\\SYSTEM32;C:\\WINDOWS;C:\\WINDOWS\\SYSTEM32\\WBEM;C:\\WINDOWS\\SYSTEM32\\WINDOWSPOWERSHELL\\V1.0\\;C:\\PROGRAM FILES (X86)\\AMD\\ATI.ACE\\CORE-STATIC;C:\\Program Files\\Lenovo\\Bluetooth Software\\;C:\\Program Files\\Lenovo\\Bluetooth Software\\syswow64;F:\\nodejs\\;C:\\WINDOWS\\system32\\config\\systemprofile\\.dnx\\bin;C:\\Program Files\\Microsoft DNX\\Dnvm\\;C:\\Program Files (x86)\\Lenovo\\Lenovo Home\\DCMainWin.exe;C:\\Users\\Administrator\\AppData\\Roaming\\npm","PATHEXT":".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC","PROCESSOR_ARCHITECTURE":"AMD64","PROCESSOR_IDENTIFIER":"Intel64 Family 6 Model 60 Stepping 3, GenuineIntel","PROCESSOR_LEVEL":"6","PROCESSOR_REVISION":"3c03","ProgramData":"C:\\ProgramData","ProgramFiles":"C:\\Program Files","ProgramFiles(x86)":"C:\\Program Files (x86)","ProgramW6432":"C:\\Program Files","PSModulePath":"C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules\\","PUBLIC":"C:\\Users\\Public","SESSIONNAME":"Console","SystemDrive":"C:","SystemRoot":"C:\\WINDOWS","TEMP":"C:\\Users\\ADMINI~1\\AppData\\Local\\Temp","TMP":"C:\\Users\\ADMINI~1\\AppData\\Local\\Temp","USERDOMAIN":"LENOVO-PC","USERDOMAIN_ROAMINGPROFILE":"LENOVO-PC","USERNAME":"Administrator","USERPROFILE":"C:\\Users\\Administrator","VS140COMNTOOLS":"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools\\","windir":"C:\\WINDOWS"}
Node Args: F:\nodejs\node.exe,c:\Users\Administrator\Desktop\nodejs-mongodb-angularjs-web-development-master\ch09\process_info.js
Execution Path: F:\nodejs\node.exe
Execution Args: []
Node Version: v4.3.2
Module Versions: {"http_parser":"2.5.2","node":"4.3.2","v8":"4.5.103.35","uv":"1.8.0","zlib":"1.2.8","ares":"1.10.1-DEV","icu":"56.1","modules":"46","openssl":"1.0.2g"}
Node Config: {"target_defaults":{"cflags":[],"default_configuration":"Release","defines":[],"include_dirs":[],"libraries":[]},"variables":{"asan":0,"host_arch":"x64","icu_data_file":"icudt56l.dat","icu_data_in":"../../deps/icu/source/data/in\\icudt56l.dat","icu_endianness":"l","icu_gyp_path":"tools/icu/icu-generic.gyp","icu_locales":"en,root","icu_path":"deps\\icu","icu_small":true,"icu_ver_major":"56","node_byteorder":"little","node_install_npm":true,"node_prefix":"/usr/local","node_release_urlbase":"","node_shared_http_parser":false,"node_shared_libuv":false,"node_shared_openssl":false,"node_shared_zlib":false,"node_tag":"","node_use_dtrace":false,"node_use_etw":true,"node_use_lttng":false,"node_use_openssl":true,"node_use_perfctr":true,"openssl_fips":"","openssl_no_asm":0,"python":"C:\\Python27\\python.exe","target_arch":"x64","v8_enable_gdbjit":0,"v8_enable_i18n_support":1,"v8_no_strict_aliasing":1,"v8_optimized_debug":0,"v8_random_seed":0,"v8_use_snapshot":true,"want_separate_host_toolset":0}}
Process ID: 8124
Process Title: C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe
Process Platform: win32
Process Architecture: x64
Memory Usage: { rss: 17641472, heapTotal: 7409232, heapUsed: 3756584 }
High-Res timer took 1 seconds and 107153 nanoseconds
Node has been running 1.128 seconds
Process finished with exit code 0本文关于Node.js进程管理中Process模块的介绍至此结束,希望对读者学习有所帮助,欢迎继续支持本站内容。