人人都会AI编程

8.3 系统信息:os 模块

更新时间:2026-07-10

在 Node.js 中,os 模块提供了一系列用于获取操作系统相关底层信息的 API。虽然它不能像专门的系统监控工具那样提供完整的实时数据,但足以满足大多数应用中对运行环境的基本感知需求——例如判断当前平台、读取内存和 CPU 概况、获取网络接口地址等。os 模块完全不需要安装,直接 require('os') 即可使用。

8.3.1 获取操作系统与平台信息

两个最常用、也是最简单的方法:

  • os.type() —— 返回操作系统名称,如 'Linux''Darwin'(macOS)、'Windows_NT'
  • os.platform() —— 返回平台标识,如 'linux''darwin''win32'

二者的区别在于 type 返回的是更具体的系统类型,而 platform 是 Node.js 编译时确定的平台值。实践中,常用 platform 来做跨平台兼容判断。

const os = require('os');

console.log(os.platform()); // 例如 'linux'
console.log(os.type());     // 例如 'Linux'
console.log(os.release());  // 内核版本,如 '5.15.0-91-generic'

还有 os.hostname() 可以获取当前机器的主机名,os.homedir() 返回当前用户的主目录路径,在需要进行本地文件路径处理时非常方便。

8.3.2 CPU 核心与负载信息

os.cpus() 返回一个对象数组,每一个对象对应一颗逻辑 CPU 核心,包含型号、速度(MHz)以及当前时间片的使用情况(times 字段)。times 保存了 CPU 在不同模式下的时间消耗,格式如下:

[
  {
    model: 'Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz',
    speed: 3600,
    times: {
      user: 1485000,    // 用户态时间
      nice: 0,          // 低优先级用户态时间
      sys: 220000,      // 内核态时间
      idle: 9000000,    // 空闲时间
      irq: 0            // 中断时间
    }
  },
  // ... 其他核心
]

实际开发中我们通常不需要直接解析 times,Node.js 提供了 os.loadavg() 方法来获取系统负载均值。它返回一个长度为 3 的数组,分别代表 1 分钟、5 分钟、15 分钟的系统平均负载(Unix 风格,Windows 下可能返回 [0, 0, 0])。

负载均值的含义是:过去一段时间内活跃进程的平均数量。如果单核 CPU 的 1 分钟负载值大于 1,说明有进程在排队等待 CPU。

还有一个实用工具是 os.uptime(),返回系统持续运行的时间(单位秒),常用于健康检查或监控启动时长。

简单监控示例

setInterval(() => {
  const load = os.loadavg();
  console.log(`系统负载(1/5/15分钟): ${load[0].toFixed(2)}, ${load[1].toFixed(2)}, ${load[2].toFixed(2)}`);
  console.log(`运行时间: ${Math.floor(os.uptime())}秒`);
}, 5000);

8.3.3 内存信息

os.totalmem()os.freemem() 分别返回系统总内存和当前空闲内存,单位是字节。结合两者可以快速计算内存使用率:

const total = os.totalmem();
const free = os.freemem();
const used = total - free;
const percent = (used / total * 100).toFixed(2);
console.log(`内存使用: ${(used / 1024 / 1024 / 1024).toFixed(2)}GB / ${(total / 1024 / 1024 / 1024).toFixed(2)}GB (${percent}%)`);

需要注意的是,freemem 仅表示操作系统层面未被分配的内存,不等于实际可用内存(因为部分内存可能被用作缓存,需要时可以被回收)。如果要在生产环境中做精确的 OOM 预警,建议结合 os.totalmem() 和进程内存占用(process.memoryUsage())综合判断。

8.3.4 网络接口信息

os.networkInterfaces() 会返回一个对象,键是网络接口名(如 eth0lowlan0),值是该接口上绑定的所有地址信息,包括 IP 地址、MAC 地址、掩码、地址族(IPv4/IPv6)等。

典型的数据结构如下:

{
  lo: [
    {
      address: '127.0.0.1',
      netmask: '255.0.0.0',
      family: 'IPv4',
      mac: '00:00:00:00:00:00',
      internal: true
    },
    // ...可能还有 IPv6 地址
  ],
  eth0: [
    {
      address: '192.168.1.100',
      netmask: '255.255.255.0',
      family: 'IPv4',
      mac: 'ab:cd:ef:12:34:56',
      internal: false
    }
  ]
}

通过遍历这些数据,我们可以:

  • 获取本机局域网 IP,用于服务注册或向其他节点宣告自己的地址。
  • 过滤内部回环接口internal: true),只关心真实网卡。
  • 获取 MAC 地址,用作设备唯一标识的一部分。

一个获取本机局域网 IPv4 地址的常见函数:

function getLocalIP() {
  const interfaces = os.networkInterfaces();
  for (const iface of Object.values(interfaces)) {
    for (const addr of iface) {
      if (addr.family === 'IPv4' && !addr.internal) {
        return addr.address;
      }
    }
  }
  return '127.0.0.1';
}

console.log('本机 IP:', getLocalIP());

8.3.5 其他实用属性和方法

  • os.arch():返回 CPU 架构,如 'x64''arm64'。在下载二进制依赖或构建原生模块时可能会用到。
  • os.tmpdir():返回系统临时目录,适合存放临时文件。
  • os.userInfo():返回当前用户信息,包含用户名、主目录、UID/GID(仅 Unix),可用于获取当前执行用户身份。
  • os.EOL:返回当前操作系统的换行符,\n\r\n,处理跨平台文本文件时避免手动拼接。

8.3.6 实战场景:一个轻量级的系统监控报告

结合 os 模块的几个关键方法,我们可以编写一个简易的系统信息快照,用于微服务的健康检查端点或启动日志:

function systemReport() {
  return {
    hostname: os.hostname(),
    platform: `${os.type()} (${os.arch()})`,
    uptime: `${Math.floor(os.uptime())}s`,
    cpus: `${os.cpus().length} cores`,
    memory: {
      total: `${(os.totalmem() / 1024 ** 3).toFixed(2)} GB`,
      free: `${(os.freemem() / 1024 ** 3).toFixed(2)} GB`,
    },
    loadavg: os.loadavg(),
    localIP: getLocalIP(),
  };
}

console.log(systemReport());

这样的报告虽然简单,但在开发调试或内网环境监控中非常实用,并且完全不依赖第三方库。

8.3.7 真实使用中的注意事项

  • Windows 兼容性:os 模块在 Windows 上也能正常工作,但个别方法如 loadavg() 可能返回空数组或全零,因为 Windows 的负载计算方式与 Unix 不同。务必在跨平台测试后再用于关键逻辑。
  • 容器环境:在 Docker 容器中,os.totalmem() 返回的是宿主机的总内存,而 freemem() 则是容器可用的内存(受 cgroup 限制)。要获取容器真实可用内存,最好结合读取 /sys/fs/cgroup/memory/memory.limit_in_bytes(Linux 下)或使用 process.memoryUsage()
  • 安全敏感信息os.networkInterfaces() 会暴露内网 IP 和 MAC 地址,不建议直接透传给前端用户,除非经过筛选。

总体而言,os 模块是 Node.js 与操作系统之间的一个轻量级窗口。它难以胜任复杂的性能监控需求,但对于基础的环境识别、资源评估和诊断信息收集来说,已经足够简洁且可靠。当你需要做出“是否需要在当前平台执行某个操作”或“服务器剩余内存是否足够”等决策时,os 模块提供的数据就是第一手的判断依据。