本篇对Node process 进行深入了解
输入、输出流
创建文件夹例子
jsconst fs=require('fs')
process.stdout.write('请输入项目名称:')
process.stdin.setEncoding('utf-8')
process.stdin.on('data',function(e){
fs.mkdirSync(e.toString().replace(/(\r\n)|(\n)/g,''))
process.stdout.write('项目创建成功\n')
process.nextTick(()=>{
process.exit()
})
})
对于导致显式终止的条件,不会触发 'beforeExit' 事件,例如调用 process.exit() 或未捕获的异常。在回调里面异步调用函数,进程会被维持
jsprocess.on('beforeExit', (code) => {
console.log('进程 beforeExit 事件的代码: ', code);
});
process.on('exit', (code) => {
console.log('进程 exit 事件的代码: ', code);
});
console.log('此消息最新显示');
只要 Promise 有以下情况,就会触发 'multipleResolves' 事件
jsprocess.on('multipleResolves', (type, promise, reason) => {
console.error(type, promise, reason);
setImmediate(() => process.exit(1));
});
async function main() {
try {
return await new Promise((resolve, reject) => {
resolve('第一次调用');
resolve('吞没解决');
reject(new Error('吞没解决'));
});
} catch {
throw new Error('失败');
}
}
main();
如果在事件循环的一次轮询中,一个 Promise 被拒绝,并且此 Promise 没有绑定错误处理器, 'unhandledRejection 事件会被触发
jsprocess.on('unhandledRejection', (reason, promise) => {
console.log('未处理的拒绝:', promise, '原因:', reason);
// 记录日志、抛出错误、或其他逻辑。
});
new Promise((resolve,reject)=>{
reject('失败')
})
每当 Promise 被拒绝并且错误处理函数附加到它(例如,使用 promise.catch())晚于一个 Node.js 事件循环时,就会触发 'rejectionHandled' 事件
jsconst unhandledRejections = new Map();
process.on('unhandledRejection', (reason, promise) => {
console.log('unhandledRejection')
unhandledRejections.set(promise, reason);
});
process.on('rejectionHandled', (promise) => {
console.log('rejectionHandled')
unhandledRejections.delete(promise);
});
let p=new Promise((resolve,reject)=>{
reject(10)
})
setImmediate(()=>{
p.catch(()=>{
})
})
当未捕获的 JavaScript 异常一直冒泡回到事件循环时,会触发 'uncaughtException' 事件。出现异常,没有错误,默认是以错误码1直接退出,设定此函数进程将会依然被保持
jslet fs=require('fs')
process.on('uncaughtException', (err, origin) => {
fs.writeSync(
process.stderr.fd,
`捕获的异常: ${err}\n` +
`异常的来源: ${origin}\n`
);
})
setTimeout(() => {
console.log('这里仍然会运行')
process.exit(20)
}, 1500)
setInterval(()=>{
console.log('进程依然在继续')
},500)
process.on('exit',(code)=>{
console.log('错误代码',code)
})
// 故意引起异常,但不要捕获它。
nonexistentFunc()
console.log('这里不会运行')
修改工作目录
jsprocess.chdir(directory)
返回当前工作目录
jsconsole.log(`Starting directory: ${process.cwd()}`);
try {
process.chdir('/usr');
console.log(`New directory: ${process.cwd()}`);
} catch (err) {
console.error(`chdir: ${err}`);
}
返回Node.js 进程的内存使用情况,上一次调用 process.cpuUsage() 方法的结果,可以作为参数值传递给此方法,得到的结果是与上一次的差值
jsprocess.cpuUsage([previousValue])
const startUsage = process.cpuUsage();
// { user: 38579, system: 6986 }
// 将 CPU 旋转 500 毫秒。
const now = Date.now();
while (Date.now() - now < 500);
console.log(process.cpuUsage(startUsage));
// { user: 514883, system: 11226 }
返回 Node.js 进程的内存使用情况
jsprocess.memoryUsage()
console.log(process.memoryUsage());
退出进程
jsprocess.exit([code])
根据进程id,杀死进程
jsprocess.kill(pid[, signal])
console.log(process.pid)
setInterval(()=>{
},100)
process.kill(process.pid, 'SIGKILL');
将一个函数推迟到当前执行栈执行完毕之后立即执行,而不是在异步任务队列中排队等待执行
jsprocess.nextTick(callback[, ...args])
第一个元素是 process.execPath。 第二个元素将是正在执行的 JavaScript 文件的路径。 其余元素将是任何其他命令行参数
process.execPath
属性返回当 Node.js 进程被启动时,Node.js 特定的命令行选项
jsconsole.log(process.argv) //[
'/Users/ccz/.nvm/versions/node/v12.14.0/bin/node',
'/Users/ccz/Public/student-project/cs/vue-cs-3.0/a2.js',
'-a',
'-b=100'
]
console.log(process.argv0) ///Users/ccz/.nvm/versions/node/v12.14.0/bin/node
console.log(process.execArgv) //[ '--harmony' ]
一旦 process.connected 为 false,则不能通过 IPC 通道使用 process.send() 发送信息
当进程正常退出,或通过 process.exit() 退出且未指定退出码时,此数值将作为进程的退出码。指定 process.exit(code) 的退出码将覆盖 process.exitCode 的原有设置
标识 Node.js 进程运行其上的操作系统平台
返回进程的 PID
返回当前父进程的 PID
本文作者:BARM
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!