21. 进程

进程对象是一个全局对象,可以从任何地方访问。 进程对象中有几种可用的方法。

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模块提供了一些与操作系统相关的基本实用程序功能。