process
对象是一个全局对象,能从任何地方访问。它也是 EventEmitter
的实例。
function () {}
进程即将退出的时候触发。它是放置检查模块状态(比如单元测试)钩子的好地方,主事件循环在 'exit' 回调完成后就不再执行,因此记时器可能不会生效。
示例:监听 exit
事件
process.on('exit', function () {
process.nextTick(function () {
console.log('不会执行到这里。');
});
console.log('即将退出。');
});
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
(大多数终端程序都支持)。
一个代表 stdout
的 Writable Stream
。
示例:console.log
的定义
console.log = function (d) {
process.stdout.write(d + '\n');
};
一个代表 stderr
的可写流(Writable Stream)。对这个流的写操作是阻塞的。
一个代表 stdin
的 Readable 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');
});
一个包含命令行参数的数组。第一个元素是 '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
启动本进程的 node 可执行文件所在的绝对路径。
示例:
/usr/local/bin/node
更改进程当前的工作目录,如果失败则抛出异常。
console.log('初始工作目录:' + process.cwd());
try {
process.chdir('/tmp');
console.log('新的工作目录:' + process.cwd());
}
catch (err) {
console.log('chdir: ' + err);
}
返回进程当前的工作目录。
console.log('Current directory: ' + process.cwd());
一个包含用户环境变量的对象。参考 environ(7)。
以指定的退出代码 code
终止进程。如果省此参数,使用代表 '成功' 的代码 0
退出。
使用代表 '失败' 的代码退出:
process.exit(1);
运行 node 的 shell 应该可以得到退出代码为 1。
获取进程的组ID,参考 getgid(2)。它是一个数字ID,不是组名。
console.log('Current gid: ' + process.getgid());
设置进程的组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);
}
获取进程的用户ID,参考 getuid(2)。它是一个数字ID,不是用户名。
console.log('Current uid: ' + process.getuid());
设置进程的用户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);
}
进程版本,即 NODE_VERSION
。
console.log('Version: ' + process.version);
安装路径,即 NODE_PREFIX
。
console.log('Prefix: ' + process.installPrefix);
向目标进程发送信号。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');
进程的 PID。
console.log('进程的 PID 是:' + process.pid);
获取/设置 'ps' 命令中显示的名称。
运行在哪个平台上。如 'linux2'
,'darwin'
,等等。
console.log('This platform is ' + process.platform);
返回一个描述 Node 进程内存使用情况的对象。
var util = require('util');
console.log(util.inspect(process.memoryUsage()));
This will generate:
{ rss: 4935680,
vsize: 41893888,
heapTotal: 1826816,
heapUsed: 650472 }
heapTotal
和 heapUsed
代表 V8 占用的内存。
在下一轮事件循环中调用这个回调函数。它不是 setTimeout(fn, 0)
的别名,它要高效得多。
process.nextTick(function () {
console.log('nextTick callback');
});
设置或读取进程的文件创建模式掩码,子进程会从父进程继承这个掩码。如果指定了 mask
参数,则返回旧的掩码,否则返回当前掩码。
var oldmask, newmask = 0644;
oldmask = process.umask(newmask);
console.log('Changed umask from: ' + oldmask.toString(8) +
' to ' + newmask.toString(8));