3

1. Process

process是一个全局的对象,不需要require。process提供控制和获取当前Node.js进程信息的能力。

1.1. Process Events

process对象实际上是一个EventEmitter的一个实例。

下面列举了process对象上可以监听的事件。

  • beforeExit 当eventloop是空的时候触发,直接调用process.exit()并不会触发此事件
  • disconnect 当IPC通道关闭时触发
  • exit 当调用 process.exit()后会触发
  • message 当消息被子进程收到是触发,消息可能会和原始消息不同
  • multipleResolves 当Promise被多次resolve时触发
  • rejectionHandled 当Promise被rejected并且错误被catch()捕获是触发
  • uncaughtException 当发生未捕获的异常时触发。当发生未捕获异常时,程序已经进入了无法预测的状态,最好的方式是重启服务
  • unhandledRejection 当Promise被rejected并且没有使用catch()去捕获是触发。最好给每一个Promise增加.catch()方法去处理错误
  • warning 当Node.js发出警告时触发
  • SIGINT 信号事件。还有SIGTERM类似的

1.2. 进程控制相关

  • process.pid 进程id
  • process.ppid 父进id
  • process.title 当前进程的名称
  • process.uptime() 获取当前Node.js进程已经运行的时长
  • process.abort() 中断Node.js进程
  • process.chdir(directory) 切换路径
  • process.cwd() 获取当前工作路径
  • process.emitWarning(warning[, options]) 发送告警信息
  • process.emitWarning(warning[, type[, code]][, ctor]) 发送告警信息, 告警信息会触发warning事件
process.on('warning', (warning) => {
  console.warn(warning.name);    // 'Warning'
  console.warn(warning.message); // 'Something happened!'
  console.warn(warning.code);    // 'MY_WARNING'
  console.warn(warning.stack);   // Stack trace
  console.warn(warning.detail);  // 'This is some additional information'
});
  • process.exit([code]) 让Node.js尽快退出。一般情况下都不需要使用该方法
  • process.exitCode 进程退出码
  • process.kill(pid[, signal]) kill进程
  • process.nextTick(callback[, ...args]) 将回调放入next tick queue, 详情建议参考event-loop-timers-and-nexttick
  • process.setUncaughtExceptionCaptureCallback(fn) 设置未捕获异常的回调

1.3. Node.js自身相关

  • process.allowedNodeEnvironmentFlags 被允许的环境标志
  • process.platform 平台信息
  • process.release Node.js版本信息
  • process.version Node.js版本信息
  • process.versions 获取Node.js依赖项的版本信息,例如v8、uv、zlib等的版本信息
  • process.env 获取系统环境变量

    • 注意: 对process.env的某个属性改变,并不会影响到系统的环境变量。例如process.env.wdd=1, 并不会在系统上创建一个名为wdd的环境量。process.env是进程内部共享,进程外部透明的。
    • 注意:process.env在 Worker线程上是只读的。
    • 注意:在windows系统,环境变量名是大小写不敏感的
    • 注意:环境变量都是字符串。设置环境变量wdd=100, 那么process.env.wdd获取的是字符串100, 而不是数字100。使用时要注意类型转换。

1.4. 系统运行状况

  • process.cpuUsage([previousValue]) 获取CPU使用率
  • process.hasUncaughtExceptionCaptureCallback() 指示使用使用process.setUncaughtExceptionCaptureCallback()设置了回调函数
  • process.memoryUsage() 获取内存使用情况

1.5. 启动参数相关

  • process.config 是一个对象,表示编译当前Node.js的一些配置参数
  • process.arch 获取当前系统CPU架构
  • process.argv 是一个数组,表示Node.js启动的参数。数组第一项是Node.js可执行文件的路径,数组的第二项是你的代码源文件路径,其余项是其他的一些参数。
node process-args.js one two=three four

// print process.argv
process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
});

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four
  • process.argv0 实际上是process.argv数组的第一项,只不过它是只读的。
  • process.execArgv 是Node.js系统自定义的一些参数,这些参数不会出现在process.argv中,例如--harmony
  • process.execPath Node.js可执行文件的路径,如 '/usr/local/bin/node'

1.6. IPC通道相关

  • process.channel IPC通道,如果IPC通道不存在,那么该值为undefined
  • process.connected 用来判断IPC通道是否还在建立
  • process.disconnect() 关闭IPC通道
  • process.send(message[, sendHandle[, options]][, callback]) 发送IPC消息

1.7. debug相关

  • process.debugPort 获取Node.js debug的端口

1.8. C++相关

  • process.dlopen(module, filename[, flags]) 动态加载C++代码

1.9. 用户与用户组

  • process.getegid() 获取有效gid
  • process.setuid(id)
  • process.geteuid() 获取有效uid
  • process.setegid(id) 设置有效uid
  • process.getgid() 获取gid
  • process.setgid(id)
  • process.getgroups() 获取
  • process.setgroups(groups)
  • process.umask([mask])

1.10. Process IO 输出输出相关

  • process.stderr 标准错误流
  • process.stdin 标准输入流
  • process.stdout 标注输出流

process.stdout和process.stderr和Node.js其他stream有很大的不同。

  1. 他们主要被console.log和console.error使用
  2. 写操作是否是同步取决于stream的类型,以及操作系统是windows还是POSIX

    • 文件:在windows和POSIX上都是同步
    • TTYs(终端):在windows上异步,在POSIX上同步
    • Pipes (sockets): 在windows上同步,在POSIX上异步

注意事项

  • 由于console.log或者console.error可能是异步的输出,所以如果输出的值和你预期的不一致,那么也不必要大惊小怪,可能因为它是异步的输出。
  • 在生产环境,不要将大量日志输出到标准输出

端端
3.8k 声望1.1k 粉丝