进程对象是一个全局对象,可以从任何地方访问。 进程对象中有几种可用的方法。
21.1. 流程事件
进程对象是EventEmitter的一个实例,并发出以下事件:
exit
:当流程即将退出时发出。 此时无法阻止退出事件循环,并且一旦所有退出侦听器都已完成运行,该进程将退出。beforeExit
:当节点清空其事件循环并且没有其他任何计划时,将发出此事件。 通常,节点在没有调度工作时退出,但’beforeExit’的侦听器可以进行异步调用,并使节点继续。uncaughtException
:当异常一直回到事件循环时发出。 如果为此异常添加了侦听器,则不会发生默认操作(即打印堆栈跟踪并退出)。Signal Events
:当进程收到SIGINT,SIGHUP等信号时发出。
21.2. 例子 (Example)
使用以下代码创建名为main.js的js文件,以侦听exit 事件:
process.on('exit', function(code) {
// Following code will never execute.
setTimeout(function() {
console.log("This will not run");
}, 0);
console.log('About to exit with code:', code);
});
console.log("Program Ended");
现在运行main.js来查看结果:$ node main.js
。验证输出:
Program Ended
About to exit with code: 0
21.2. 退出代码
当没有更多异步操作挂起时,节点通常以0状态代码退出。 还有其他退出代码,如下所述:
Uncaught Fatal Exception
:有一个未捕获的异常,它不是由域或uncaughtException事件处理程序处理的。Unused
:由Bash保留用于内置滥用。Internal JavaScript Parse Error
:Node的引导过程内部的JavaScript源代码导致解析错误。 这种情况极为罕见,通常只能在Node本身的开发过程中发生。Internal JavaScript Evaluation Failure
:Node的引导过程中内部的JavaScript源代码在评估时未能返回函数值。 这种情况极为罕见,通常只能在Node本身的开发过程中发生。Fatal Error
:V8中存在致命的无法恢复的错误。 通常,将使用前缀FATAL ERROR将消息打印到stderr。Non-function Internal Exception Handler
:有一个未捕获的异常,但内部致命异常处理函数以某种方式设置为非函数,并且无法调用。Internal Exception Handler Run-Time Failure
:有一个未捕获的异常,并且内部致命异常处理程序函数本身在尝试处理它时引发了错误。Unused
Invalid Argument
:指定了未知选项,或者提供了需要值的选项而没有值。Internal JavaScript Run-Time Failure
:在调用bootstrapping函数时,Node的引导过程内部的JavaScript源代码会引发错误。 这种情况极为罕见,通常只能在Node本身的开发过程中发生。Invalid Debug Argument
:设置了–debug和/或–debug-brk选项,但选择了无效的端口号。Signal Exits
:如果Node收到致命信号,如SIGKILL或SIGHUP,则其退出代码将为128加上信号代码的值。 这是一种标准的Unix实践,因为退出代码定义为7位整数,信号出口设置高位,然后包含信号代码的值。
21.3. 流程属性
Process提供了许多有用的属性,可以更好地控制系统交互。
stdout
:stdout的可写流。stderr
:stderr的可写流。stdin
:stdin的可写流。argv
:包含命令行参数的数组。 第一个元素是’node’,第二个元素是JavaScript文件的名称。 下一个元素将是任何其他命令行参数。execPath
:这是启动该进程的可执行文件的绝对路径名。execArgv
:这是启动该进程的可执行文件中特定于节点的命令行选项集。env
:包含用户环境的对象。exitCode
:当进程正常退出或通过process.exit()退出而不指定代码时,将成为进程退出代码的数字。version
:一个公开NODE_VERSION的编译属性。versions
:公开节点及其依赖项的版本字符串的属性。config
:一个Object,包含用于编译当前节点可执行文件的configure选项的JavaScript表示形式。 这与运行./configure脚本时生成的“config.gypi”文件相同。pid
:进程的PID。title
:Getter/setter设置’ps’中显示的内容。arch
:您正在运行的处理器架构:’arm’,’ia32’或’x64’。platform
:你正在运行什么平台:’darwin’,’freebsd’,’Linux’,’sunos’或’win32′mainModule
:检索require.main的替代方法。 不同之处在于,如果主模块在运行时更改,则require.main可能仍会引用更改发生之前所需的模块中的原始主模块。 通常可以安全地假设两者指的是同一个模块。
21.3.1. 示例
使用以下代码创建名为main.js的js文件:
// Printing to console
process.stdout.write("Hello World!" + "\n");
// Reading passed parameter
process.argv.forEach(function(val, index, array) {
console.log(index + ': ' + val);
});
// Getting executable path
console.log(process.execPath);
// Platform Information
console.log(process.platform);
现在运行main.js来查看结果:$ node main.js
。在Linux机器上运行程序时验证输出:
Hello World!
0: node
1: /web/com/1427106219_25089/main.js
/usr/bin/node
linux
21.4. 方法参考
流程提供了许多有用的方法来更好地控制系统交互。
abort()
:它会导致节点发出中止。 它导致节点退出并生成核心文件。chdir(directory)
:更改进程的当前工作目录,如果失败则抛出异常。cwd()
:返回进程的当前工作目录。exit([code])
:使用指定的代码结束进程。 如果省略,则退出使用“成功”代码0。getgid()
:获取进程的组标识。 这是数字组ID,而不是组名。此功能仅适用于POSIX平台(即不是Windows,Android)。setgid(id)
:设置进程的组标识。 它接受数字ID或组名字符串。 如果指定了groupname,则此方法会在将其解析为数字ID时阻塞。此功能仅适用于POSIX平台(即不适用于Windows,Android)。getuid()
:获取进程的用户标识。 这是数字ID,而不是用户名。此功能仅适用于POSIX平台(即Windows,Android)。setuid(id)
:设置进程的用户标识。 它接受数字ID或用户名字符串。 如果指定了用户名,则此方法会在将其解析为数字ID时阻止。此功能仅适用于POSIX平台(即不适用于Windows,Android)。getgroups()
:返回具有补充组ID的数组。 如果包含有效的组ID,则POSIX不指定,但node.js确保它始终是。 此功能仅适用于POSIX平台(即Windows,Android)。setgroups(groups)
:设置补充组ID。 这是一种特权操作,这意味着您必须位于root或具有CAP_SETGID功能。 此功能仅适用于POSIX平台(即Windows,Android)。initgroups(user, extra_group)
:读取/ etc/group并使用用户所属的所有组初始化组访问列表。 这是一种特权操作,这意味着您必须位于root或具有CAP_SETGID功能。 此功能仅适用于POSIX平台(即Windows,Android)。kill(pid[, signal])
:向进程发送信号。 pid是进程id,signal是描述要发送的信号的字符串。 信号名称是’SIGINT’或’SIGHUP’之类的字符串。 如果省略,信号将为“SIGTERM”。memoryUsage()
:返回一个对象,描述以字节为单位测量的Node进程的内存使用情况。nextTick(callback)
:一旦当前事件循环转向运行完成,请调用回调函数。umask([mask])
:设置或读取进程的文件模式创建掩码。 子进程从父进程继承掩码。 如果给出了mask参数,则返回旧掩码,否则返回当前掩码。uptime()
:节点运行的秒数。hrtime()
:以[seconds,nanoseconds]元组数组返回当前的高分辨率实时。 它相对于过去的任意时间。 它与一天中的时间无关,因此不受时钟漂移的影响。 主要用于测量间隔之间的性能。
21.4.1. 示例
使用以下代码创建名为main.js的js文件:
// Print the current directory
console.log('Current directory: ' + process.cwd());
// Print the process version
console.log('Current version: ' + process.version);
// Print the memory usage
console.log(process.memoryUsage());
现在运行main.js来查看结果:$ node main.js
。在Linux机器上运行程序时验证输出:
Current directory: /web/com/1427106219_25089
Current version: v0.10.33
{ rss: 11505664, heapTotal: 4083456, heapUsed: 2157704 }
下一节:Node.js os模块提供了一些与操作系统相关的基本实用程序功能。