模块 process
进程处理模块,用以管理当前进程的资源
引用方法:
1var process = require('process');
进程事件
process 模块对象是 EventEmitter 的实例,可以通过注册事件监听器响应进程级别的事件。
beforeExit 事件
当 fibjs 的任务已经为空,并且没有额外的工作被添加进来,事件 beforeExit
会被触发
1process.on('beforeExit', exitCode => {});
正常情况下,如果没有额外的工作被添加到任务队列,fibjs 进程会结束。但是如果 beforeExit
事件绑定的监听器的回调函数中,启动了一个新的任务,比如开启一个 fiber,那么 fibjs 进程会继续运行。
process.exitCode 作为唯一的参数值传递给 beforeExit
事件监听器的回调函数。如果进程由于显式的原因而将要终止,例如直接调用 process.exit 或抛出未捕获的异常,beforeExit
事件不会被触发。
exit 事件
当 fibjs 退出时,事件 exit
会被触发,一旦所有与 exit
事件绑定的监听器执行完成,进程会终止
1process.on('exit', exitCode => {});
exit
事件监听器的回调函数,只有一个入参,这个参数的值可以是 process.exitCode 的属性值,或者是调用 process.exit 方法时传入的 exitCode
值。
Signal 事件
当 fibjs 进程接收到一个信号时,会触发信号事件,目前支持的信号有 SIGINT 和 SIGTERM。每个事件名称,以信号名称的大写表示 (比如事件'SIGINT' 对应信号 SIGINT)。
信号事件不同于其它进程事件,信号事件是抢占的,当信号发生时,无论当前在 io 操作,还是 JavaScript 运算,都会尽快触发相应事件。比如你可以用下面的代码,中断当前应用,并输出运行状态:
1
2
3
4
5
6var coroutine = require('coroutine');
process.on('SIGINT', () => {
coroutine.fibers.forEach(f => console.error("Fiber %d:\n%s", f.id, f.stack));
process.exit();
});
信号名称及其意义如下:
- SIGINT:在终端运行时,可以被所有平台支持,通常可以通过 CTRL+C 触发。
- SIGTERM:当进程被 kill 时触发此信号。Windows 下不支持。
静态函数
umask
改变当前的 umask,Windows 不支持此方法
1static Integer process.umask(Integer mask);
调用参数:
- mask: Integer, 指定新的掩码
返回结果:
- Integer, 返回之前的 mask
改变当前的 umask,Windows 不支持此方法
1static Integer process.umask(String mask);
调用参数:
- mask: String, 指定新的掩码, 字符串类型八进制(e.g: "0664")
返回结果:
- Integer, 返回之前的 mask
返回当前的 umask,Windows 不支持此方法
1static Integer process.umask();
返回结果:
- Integer, 返回当前的 mask 值
hrtime
返回系统高精度时间,此时间与当前时间无关,仅用于高精度计时
1static Array process.hrtime(Array diff = []);
调用参数:
- diff: Array, 用于比较的初始时间
返回结果:
- Array, 返回计时时间,格式为 [seconds, nanoseconds]
exit
退出当前进程,并返回 exitCode 作为进程结果
1static process.exit();
退出当前进程,并返回结果
1static process.exit(Integer code);
调用参数:
- code: Integer, 返回进程结果
cwd
返回操作系统当前工作路径
1static String process.cwd();
返回结果:
- String, 返回当前系统路径
dlopen
动态加载 C++ Addons
1
2
3static process.dlopen(Object module,
String filename,
Integer flags = 1);
调用参数:
- module: Object, 指定要加载的模块
- filename: String, 指定要加载的模块文件名
- flags: Integer, 指定加载模块的方式,缺省为 1
chdir
修改操作系统当前工作路径
1static process.chdir(String directory);
调用参数:
- directory: String, 指定设定的新路径
uptime
查询运行环境运行时间,以秒为单位
1static Number process.uptime();
返回结果:
- Number, 返回表示时间的数值
cpuUsage
查询当前进程在用户和系统代码中花费的时间,其值为微秒值(百万分之一秒)
1static Object process.cpuUsage(Object previousValue = {});
调用参数:
- previousValue: Object, 指定上一次查询的时间
返回结果:
- Object, 返回包含时间报告
内存报告生成类似以下结果:
1
2
3
4{
"user": 132379,
"system": 50507
}
其中:
- user 返回进程在用户代码中花费的时间
- system 返回进程在系统代码中花费的时间
memoryUsage
查询当前进程内存使用报告
1static Object process.memoryUsage();
返回结果:
- Object, 返回包含内存报告
内存报告生成类似以下结果:
1
2
3
4
5{
"rss": 8622080,
"heapTotal": 4083456,
"heapUsed": 1621800
}
其中:
- rss 返回进程当前占用物理内存大小
- heapTotal 返回 v8 引擎堆内存大小
- heapUsed 返回 v8 引擎正在使用堆内存大小
nextTick
启动一个纤程
1
2static process.nextTick(Function func,
...args);
调用参数:
- func: Function, 制定纤程执行的函数
- args: ..., 可变参数序列,此序列会在纤程内传递给函数
binding
获取指定名称的内部模块
1static Value process.binding(String name);
调用参数:
- name: String, 指定要查询的内部模块名称
返回结果:
- Value, 返回指定的内部模块
getgid
查询当前进程的组 id
1static Integer process.getgid();
返回结果:
- Integer, 返回当前进程的组 id
getuid
查询当前进程的用户 id
1static Integer process.getuid();
返回结果:
- Integer, 返回当前进程的用户 id
setgid
设置当前进程的组 id
1static process.setgid(Integer id);
调用参数:
- id: Integer, 指定要设置的组 id
setuid
设置当前进程的用户 id
1static process.setuid(Integer id);
调用参数:
- id: Integer, 指定要设置的用户 id
emitWarning
发出自定义或特定于应用程序的进程警告。可以通过向 'warning' 事件添加处理程序来监听这些事件
1
2static process.emitWarning(Value warning,
Object options);
调用参数:
- warning: Value, 指定要发出的警告
options: Object, 指定警告的选项
选项包含以下内容:
1
2
3
4
5{
"type": "Warning", // specifies the name of the type of warning issued. Default value: 'Warning'
"code": "", // specify the unique identifier of the warning instance issued
"detail": "" // specify additional text for warnings
}
使用方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17const {
emitWarning
} = require('process');
// Emit a warning with a code and additional detail.
emitWarning('Something happened!', {
code: 'MY_WARNING',
detail: 'This is some additional information',
});
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'
});
发出自定义或特定于应用程序的进程警告。可以通过向 'warning' 事件添加处理程序来监听这些事件
1
2
3static process.emitWarning(Value warning,
String type = "Warning",
String code = "");
调用参数:
- warning: Value, 指定要发出的警告
- type: String, 指定发出的警告类型的名称。默认值:'Warning'
- code: String, 指定发出的警告实例的唯一标识符
disconnect
关闭与父进程的 ipc 管道
1static process.disconnect();
send
向父进程发送一个消息
1static process.send(Value msg);
调用参数:
- msg: Value, 指定发送的消息
静态属性
argv
Array, 返回当前进程的命令行参数
1static readonly Array process.argv;
execArgv
Array, 返回当前进程的特殊命令行参数,这些参数被 fibjs 用于设置运行环境
1static readonly Array process.execArgv;
version
String, 返回 fibjs 版本字符串
1static readonly String process.version;
versions
Object, 返回 fibjs 及组件的版本信息
1static readonly Object process.versions;
execPath
String, 查询当前运行执行文件完整路径
1static readonly String process.execPath;
env
Object, 查询当前进程的环境变量
1static readonly Object process.env;
arch
String, 查询当前 cpu 环境,可能的结果为 'amd64', 'arm', 'arm64', 'ia32'
1static readonly String process.arch;
platform
String, 查询当前平台名称,可能的结果为 'darwin', 'freebsd', 'linux', 或 'win32'
1static readonly String process.platform;
pid
Integer, 读取当前对象指向的进程的 id
1static readonly Integer process.pid;
ppid
Integer, 读取当前对象指向的父进程的 id
1static readonly Integer process.ppid;
stdin
Stream, 查询当前进程标准输入对象, 在 tty 中为 TTYInputStream, 否则为 Stream
1static readonly Stream process.stdin;
stdout
Stream, 查询当前进程标准输出对象, 在 tty 中为 TTYOutputStream, 否则为 Stream
1static readonly Stream process.stdout;
stderr
Stream, 查询当前进程标准错误输出对象, 在 tty 中为 TTYOutputStream, 否则为 Stream
1static readonly Stream process.stderr;
exitCode
Integer, 查询和设置当前进程的退出码
1static Integer process.exitCode;
connected
Boolean, 查询与父进程的管道是否正常连接
1static readonly Boolean process.connected;