Node.js process 对象详解

一、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());
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空下的DeppBing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值