Node.js 核心模块:os 操作系统信息

os 模块提供了与操作系统相关的实用方法和属性。通过它,你可以获取系统的硬件信息、网络接口、系统常量等,非常适合用于系统监控、诊断工具或需要了解运行环境的应用程序。本章将详细介绍 os 模块的常用 API 并提供实用示例。

1. 引入 os 模块

os 是 Node.js 的内置模块,无需安装,直接引入即可:

const os = require('os');

2. 常用属性与常量

2.1 os.EOL

返回当前操作系统的换行符:POSIX 上是 \n,Windows 上是 \r\n。在生成跨平台文本文件时非常有用。

console.log('换行符:', JSON.stringify(os.EOL));
// Windows: '\r\n', Linux/macOS: '\n'

2.2 系统常量

os.constants 对象包含了各种错误码、信号等常量。例如:

console.log(os.constants.signals); // 信号常量
console.log(os.constants.errno);   // 错误码常量

3. 系统信息方法

3.1 os.arch()

返回编译 Node.js 的可执行文件的 CPU 架构。可能的值有 'arm''arm64''ia32''mips''mipsel''ppc''ppc64''s390''s390x''x32''x64'

console.log('CPU架构:', os.arch()); // 例如 'x64'

3.2 os.cpus()

返回一个对象数组,包含每个逻辑 CPU 核心的信息。每个对象包含 model(型号)、speed(速度,单位 MHz)和 times(一个包含用户、系统、空闲等时间统计的对象)。

const cpus = os.cpus();
console.log('CPU 核心数:', cpus.length);
cpus.forEach((cpu, index) => {
  console.log(`CPU ${index}: ${cpu.model}, 速度: ${cpu.speed}MHz`);
});

3.3 os.freemem() 与 os.totalmem()

os.freemem() 返回系统空闲内存的字节数,os.totalmem() 返回系统总内存的字节数。

const freeMem = os.freemem();
const totalMem = os.totalmem();
console.log(`空闲内存: ${(freeMem / 1024 / 1024).toFixed(2)} MB`);
console.log(`总内存: ${(totalMem / 1024 / 1024).toFixed(2)} MB`);
console.log(`内存使用率: ${((1 - freeMem/totalMem) * 100).toFixed(2)}%`);

3.4 os.homedir()

返回当前用户的主目录路径。

console.log('用户主目录:', os.homedir());

3.5 os.hostname()

返回操作系统的主机名。

console.log('主机名:', os.hostname());

3.6 os.networkInterfaces()

返回一个对象,包含网络接口信息。每个网络接口包含地址、家族、MAC 地址等详细信息。这对于获取本机 IP 地址非常有用。

const nets = os.networkInterfaces();
for (const name of Object.keys(nets)) {
  for (const net of nets[name]) {
    // 跳过内部地址和 IPv6
    if (!net.internal && net.family === 'IPv4') {
      console.log(`接口 ${name}: ${net.address}`);
    }
  }
}

3.7 os.platform()

返回编译 Node.js 的操作系统平台。可能的值有 'aix''darwin''freebsd''linux''openbsd''sunos''win32'

console.log('操作系统平台:', os.platform());

3.8 os.release()

返回操作系统的版本。

console.log('操作系统版本:', os.release());

3.9 os.tmpdir()

返回操作系统的默认临时目录。

console.log('临时目录:', os.tmpdir());

3.10 os.type()

返回操作系统名称。在 Linux 上返回 'Linux',在 macOS 上返回 'Darwin',在 Windows 上返回 'Windows_NT'

console.log('操作系统类型:', os.type());

3.11 os.uptime()

返回系统启动后的运行时间(单位:秒)。

const uptime = os.uptime();
const hours = Math.floor(uptime / 3600);
const minutes = Math.floor((uptime % 3600) / 60);
const seconds = Math.floor(uptime % 60);
console.log(`系统已运行: ${hours} 小时 ${minutes} 分钟 ${seconds} 秒`);

3.12 os.userInfo()

返回当前用户的信息,包括用户名、uid、gid、主目录、默认 shell。在 Windows 上可能部分字段缺失。

const userInfo = os.userInfo();
console.log('用户名:', userInfo.username);
console.log('主目录:', userInfo.homedir);
console.log('Shell:', userInfo.shell);

3.13 os.loadavg()

返回系统的平均负载数组(1分钟、5分钟、15分钟)。注意:在 Windows 上始终返回 [0, 0, 0]

const loadavg = os.loadavg();
console.log('1分钟平均负载:', loadavg[0]);
console.log('5分钟平均负载:', loadavg[1]);
console.log('15分钟平均负载:', loadavg[2]);

4. 实用示例:系统监控脚本

以下是一个简单的系统监控脚本,定期输出系统信息:

const os = require('os');

function getSystemInfo() {
  return {
    platform: os.platform(),
    hostname: os.hostname(),
    arch: os.arch(),
    cpus: os.cpus().length,
    memory: {
      total: (os.totalmem() / 1024 / 1024 / 1024).toFixed(2) + ' GB',
      free: (os.freemem() / 1024 / 1024 / 1024).toFixed(2) + ' GB',
      usage: ((1 - os.freemem() / os.totalmem()) * 100).toFixed(2) + '%'
    },
    uptime: os.uptime(),
    loadavg: os.loadavg()
  };
}

setInterval(() => {
  console.clear();
  console.log('===== 系统监控 =====');
  console.log(getSystemInfo());
}, 2000);

5. 跨平台注意事项

  • 某些方法在 Windows 上的行为可能与 POSIX 系统不同,例如 os.loadavg() 返回空值。
  • 路径相关的方法(如 os.tmpdir())返回的路径分隔符是平台相关的,建议与 path 模块配合使用。
  • 在获取用户信息时,Windows 可能缺少 shell 字段。

6. 结合其他模块的应用

os 模块常与 fspath 等结合,例如创建临时文件:

const os = require('os');
const path = require('path');
const fs = require('fs').promises;

async function createTempFile() {
  const tmpDir = os.tmpdir();
  const filePath = path.join(tmpDir, 'my-temp-file.txt');
  await fs.writeFile(filePath, '临时数据');
  console.log('临时文件创建于:', filePath);
}

createTempFile();

小结

os 模块提供了丰富的 API 来获取底层操作系统信息,对于系统监控、环境检测、跨平台工具开发非常有帮助。通过本章的学习,你应该掌握了常用方法的使用,并能够结合实际需求编写系统相关的程序。下一章我们将介绍 url 模块,用于解析和处理 URL。