Node.js 中文手册

中文翻译:www.nodecn.org 转载请注明出处

目录


process

process 对象是一个全局对象,能从任何地方访问。它也是 EventEmitter 的实例。

'exit' 事件

function () {}

进程即将退出的时候触发。它是放置检查模块状态(比如单元测试)钩子的好地方,主事件循环在 'exit' 回调完成后就不再执行,因此记时器可能不会生效。

示例:监听 exit 事件

process.on('exit', function () {
  process.nextTick(function () {
    console.log('不会执行到这里。');
  });
  console.log('即将退出。');
});

'uncaughtException' 事件

function (err) { }

当一个异常冒泡至主事件循环(即该事件未被捕获)时触发。如果监听了此事件,默认动作(打印错误堆栈并退出)不会被执行。

示例:监听 uncaughtException 事件

process.on('uncaughtException', function (err) {
  console.log('捕获到异常:' + err);
});

setTimeout(function () {
  console.log('这里仍然会执行。');
}, 500);

// 故意制造一个异常,不捕获它
nonexistentFunc();
console.log('这里就不会执行了。');

注意:uncaughtException 是一种非常原始的异常处理机制,在程序中使用 try / catch 能更好地控制流程。对于服务器上需要长期运行的程序来说,uncaughtException 是一个很有用的安全机制。

信号事件

function () {}

进行收到信号时触发。参考 sigaction(2) 以获取SIGINT, SIGUSR1 之类的标准 POSIX 信号列表。

救命:监听 SIGINT 事件

// 开始从标准输入读取数据,所以不会立即退出
process.stdin.resume();

process.on('SIGINT', function () {
  console.log('收到 SIGINT 信号,按 Control+D 退出。');
});

想要向进程发送 SIGINT 信号,比较简单的办法是按 Control+C(大多数终端程序都支持)。

process.stdout

一个代表 stdoutWritable Stream

示例:console.log 的定义

console.log = function (d) {
  process.stdout.write(d + '\n');
};

process.stderr

一个代表 stderr 的可写流(Writable Stream)。对这个流的写操作是阻塞的。

process.stdin

一个代表 stdinReadable Stream。标准输入流默认是暂停的,所以你必须调用 process.stdin.resume() 来读取 stdin

示例:打开标准输入并监听事件

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', function (chunk) {
  process.stdout.write('data: ' + chunk);
});

process.stdin.on('end', function () {
  process.stdout.write('end');
});

process.argv

一个包含命令行参数的数组。第一个元素是 'node',第二个是 JavaScript 文件名,接下来是附加的命令行参数。

// 打印 process.argv
process.argv.forEach(function (val, index, array) {
  console.log(index + ': ' + val);
});

运行结果:

$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four

process.execPath

启动本进程的 node 可执行文件所在的绝对路径。

示例:

/usr/local/bin/node

process.chdir(directory)

更改进程当前的工作目录,如果失败则抛出异常。

console.log('初始工作目录:' + process.cwd());
try {
  process.chdir('/tmp');
  console.log('新的工作目录:' + process.cwd());
}
catch (err) {
  console.log('chdir: ' + err);
}

process.cwd()

返回进程当前的工作目录。

console.log('Current directory: ' + process.cwd());

process.env

一个包含用户环境变量的对象。参考 environ(7)。

process.exit(code=0)

以指定的退出代码 code 终止进程。如果省此参数,使用代表 '成功' 的代码 0 退出。

使用代表 '失败' 的代码退出:

process.exit(1);

运行 node 的 shell 应该可以得到退出代码为 1。

process.getgid()

获取进程的组ID,参考 getgid(2)。它是一个数字ID,不是组名。

console.log('Current gid: ' + process.getgid());

process.setgid(id)

设置进程的组ID,参考 setgid(2)。组ID(数字)或者组名(字符串)都接受。如果指定的是组名,本方法会因解析组名而阻塞。

console.log('Current gid: ' + process.getgid());
try {
  process.setgid(501);
  console.log('New gid: ' + process.getgid());
}
catch (err) {
  console.log('Failed to set gid: ' + err);
}

process.getuid()

获取进程的用户ID,参考 getuid(2)。它是一个数字ID,不是用户名。

console.log('Current uid: ' + process.getuid());

process.setuid(id)

设置进程的用户ID,参考 setuid(2)。用户ID(数字)或者用户名(字符串)都接受。如果指定的是用户名,本方法会因解析用户名而阻塞。

console.log('Current uid: ' + process.getuid());
try {
  process.setuid(501);
  console.log('New uid: ' + process.getuid());
}
catch (err) {
  console.log('Failed to set uid: ' + err);
}

process.version

进程版本,即 NODE_VERSION

console.log('Version: ' + process.version);

process.installPrefix

安装路径,即 NODE_PREFIX

console.log('Prefix: ' + process.installPrefix);

process.kill(pid, signal='SIGTERM')

向目标进程发送信号。pid 为目标进程ID,signal 为信号名称。信号名称为类似 'SIGINT' 或 'SIGUSR1' 的字符串,如果省略,默认为 'SIGTERM'(参考 kill(2))。

注意:尽管本方法名为 process.kill,但它只用来发送信号,像 kill 系统调用那样。发送信号除了结束目标进程,还能做其它事情。

示例:给自己发送一个信号

process.on('SIGHUP', function () {
  console.log('收到 SIGHUP 信号。');
});

setTimeout(function () {
  console.log('正在退出……');
  process.exit(0);
}, 100);

process.kill(process.pid, 'SIGHUP');

process.pid

进程的 PID。

console.log('进程的 PID 是:' + process.pid);

process.title

获取/设置 'ps' 命令中显示的名称。

process.platform

运行在哪个平台上。如 'linux2''darwin',等等。

console.log('This platform is ' + process.platform);

process.memoryUsage()

返回一个描述 Node 进程内存使用情况的对象。

var util = require('util');

console.log(util.inspect(process.memoryUsage()));

This will generate:

{ rss: 4935680,
  vsize: 41893888,
  heapTotal: 1826816,
  heapUsed: 650472 }

heapTotalheapUsed 代表 V8 占用的内存。

process.nextTick(callback)

在下一轮事件循环中调用这个回调函数。它不是 setTimeout(fn, 0) 的别名,它要高效得多。

process.nextTick(function () {
  console.log('nextTick callback');
});

process.umask([mask])

设置或读取进程的文件创建模式掩码,子进程会从父进程继承这个掩码。如果指定了 mask 参数,则返回旧的掩码,否则返回当前掩码。

var oldmask, newmask = 0644;

oldmask = process.umask(newmask);
console.log('Changed umask from: ' + oldmask.toString(8) +
            ' to ' + newmask.toString(8));