
一、process 对象概述
1.1 什么是 process 对象
process 对象是 Node.js 的全局对象,提供当前 Node.js 进程的信息和控制能力,无需使用 require() 导入即可使用。
1.2 基本属性
console.log('进程ID:', process.pid);
console.log('Node.js版本:', process.version);
console.log('平台:', process.platform);
console.log('架构:', process.arch);
console.log('当前工作目录:', process.cwd());
console.log('执行路径:', process.execPath);
二、进程信息与监控
2.1 内存使用情况
// 内存监控
function monitorMemory() {
const memoryUsage = process.memoryUsage();
console.log(`
=== 内存使用情况 ===
常驻内存: ${Math.round(memoryUsage.rss / 1024 / 1024)} MB
堆总计: ${Math.round(memoryUsage.heapTotal / 1024 / 1024)} MB
堆使用: ${Math.round(memoryUsage.heapUsed / 1024 / 1024)} MB
外部内存: ${Math.round(memoryUsage.external / 1024 / 1024)} MB
数组缓冲区: ${Math.round(memoryUsage.arrayBuffers / 1024 / 1024)} MB
`);
}
// 定期监控
setInterval(monitorMemory, 5000);
2.2 CPU 使用情况
// CPU使用监控
const startUsage = process.cpuUsage();
setTimeout(() => {
const endUsage = process.cpuUsage(startUsage);
console.log(`
=== CPU使用情况 ===
用户模式CPU时间: ${endUsage.user / 1000} 微秒
系统模式CPU时间: ${endUsage.system / 1000} 微秒
总CPU时间: ${(endUsage.user + endUsage.system) / 1000} 微秒
`);
}, 1000);
2.3 运行时间与性能
console.log('进程运行时间:', process.uptime(), '秒');
console.log('高精度时间:', process.hrtime());
console.log('Node.js启动时间:', process.hrtime.bigint(), '纳秒');
// 性能测量
const start = process.hrtime();
// 执行一些操作
setTimeout(() => {
const diff = process.hrtime(start);
console.log(`操作耗时: ${diff[0]}秒 ${diff[1] / 1000000}毫秒`);
}, 100);
三、进程控制与管理
3.1 进程退出控制
// 正常退出
process.exit(0); // 成功退出
// process.exit(1); // 错误退出
// 退出前清理
process.on('exit', (code) => {
console.log(`进程即将退出,退出码: ${code}`);
// 这里只能执行同步操作
});
// 优雅关闭
function gracefulShutdown() {
console.log('开始优雅关闭...');
// 停止接收新请求
server.close(() => {
console.log('所有连接已关闭');
// 关闭数据库连接等资源
database.close(() => {
console.log('数据库连接已关闭');
process.exit(0);
});
});
// 强制超时
setTimeout(() => {
console.log('强制退出');
process.exit(1);
}, 10000);
}
// 捕获退出信号
process.on('SIGTERM', gracefulShutdown);
process.on('SIGINT', gracefulShutdown);
3.2 环境变量与配置
// 环境变量访问
console.log('NODE_ENV:', process.env.NODE_ENV);
console.log('PATH:', process.env.PATH);
// 设置环境变量
process.env.MY_APP_VERSION = '1.0.0';
process.env.DEBUG = 'app:*';
// 配置管理类
class Config {
constructor() {
this.config = {
port: process.env.PORT || 3000,
dbHost: process.env.DB_HOST || 'localhost',
dbPort: process.env.DB_PORT || 5432,
logLevel: process.env.LOG_LEVEL || 'info'
};
}
get(key) {
return this.config[key];
}
validate() {
const required = ['DB_HOST', 'DB_USER', 'DB_PASS'];
const missing = required.filter(key => !process.env[key]);
if (missing.length > 0) {
throw new Error(`缺少必需的环境变量: ${missing.join(', ')}`);
}
}
}
四、输入输出与通信
4.1 标准输入输出
// 标准输入
process.stdin.setEncoding('utf8');
process.stdin.on('data', (input) => {
const cleanedInput = input.trim();
if (cleanedInput === 'exit') {
console.log('再见!');
process.exit(0);
} else if (cleanedInput === 'memory') {
console.log(process.memoryUsage());
} else {
console.log(`收到输入: ${cleanedInput}`);
}
});
console.log('请输入命令 (输入 "exit" 退出):');
// 标准输出
process.stdout.write('这是标准输出\n');
process.stderr.write('这是错误输出\n');
// 格式化输出
function progressBar(percentage) {
const width = 50;
const filled = Math.round(width * percentage);
const empty = width - filled;
process.stdout.write(`\r[${'█'.repeat(filled)}${'░'.repeat(empty)}] ${Math.round(percentage * 100)}%`);
}
// 模拟进度条
let progress = 0;
const interval = setInterval(() => {
progress += 0.1;
progressBar(progress);
if (progress >= 1) {
clearInterval(interval);
process.stdout.write('\n完成!\n');
}
}, 200);
4.2 进程间通信
// 主进程
if (process.argv.includes('--child')) {
// 子进程逻辑
process.on('message', (message) => {
console.log('子进程收到消息:', message);
// 处理消息
const result = `处理结果: ${message.data * 2}`;
// 发送回主进程
process.send({ result, pid: process.pid });
});
// 通知主进程已准备好
process.send({ type: 'ready' });
} else {
// 主进程逻辑
const { fork } = require('child_process');
const child = fork(__filename, ['--child']);
child.on('message', (message) => {
if (message.type === 'ready') {
console.log('子进程已准备好');
// 发送任务给子进程
for (let i = 1; i <= 5; i++) {
child.send({ data: i, taskId: i });
}
} else {
console.log('收到子进程结果:', message);
}
});
}
五、事件与错误处理
5.1 进程事件
// 未捕获异常处理
process.on('uncaughtException', (error) => {
console.error('未捕获的异常:', error);
// 记录错误
const fs = require('fs');
fs.appendFileSync('error.log', `${new Date().toISOString()}: ${error.stack}\n`);
// 优雅退出
setTimeout(() => {
process.exit(1);
}, 1000);
});
// 未处理的Promise拒绝
process.on('unhandledRejection', (reason, promise) => {
console.error('未处理的Promise拒绝:', reason);
// 可以在这里进行错误报告
reportError(reason);
});
// 警告事件
process.on('warning', (warning) => {
console.warn('进程警告:', warning.name);
console.warn('警告信息:', warning.message);
console.warn('堆栈跟踪:', warning.stack);
});
// 信号事件
process.on('SIGUSR1', () => {
console.log('收到SIGUSR1信号,执行诊断...');
console.log(process.memoryUsage());
});
process.on('SIGUSR2', () => {
console.log('收到SIGUSR2信号,重新加载配置...');
reloadConfig();
});
5.2 调试与诊断
// 调试信息
console.log('进程参数:', process.argv);
console.log('执行路径:', process.execPath);
console.log('调试端口:', process.debugPort);
// 创建诊断报告
function generateDiagnosticReport() {
const report = {
timestamp: new Date().toISOString(),
pid: process.pid,
platform: process.platform,
arch: process.arch,
versions: process.versions,
memory: process.memoryUsage(),
uptime: process.uptime(),
argv: process.argv,
env: Object.keys(process.env).slice(0, 10) // 只显示前10个环境变量
};
return JSON.stringify(report, null, 2);
}
// 在特定条件下生成报告
process.on('uncaughtException', () => {
const report = generateDiagnosticReport();
require('fs').writeFileSync(`diagnostic-${process.pid}.json`, report);
});
console.log('诊断报告示例:');
console.log(generateDiagnosticReport());
654

被折叠的 条评论
为什么被折叠?



