Node.js OS 模組:獲取作業系統硬體與環境資訊

在開發伺服器應用或是自動化腳本時,了解硬體的即時狀態(如 CPU 分佈、可用記憶體)以及作業系統環境非常重要。Node.js 內建的 os 模組提供了一系列跨平台的工具函數,讓你輕鬆讀取底層資訊。

硬體規格與負載

這對於決定應用程式的併發策略(例如 Cluster 模式)非常有幫助。

1. CPU 核心詳細資訊

const os = require('os');
const cpus = os.cpus();

console.log(`核心數量:${cpus.length}`);
// 取得第一個核心的運作速度
console.log(`核心型號:${cpus[0].model} @ ${cpus[0].speed}MHz`);

2. 記憶體狀態監控

注意:os 返回的預設單位是 Bytes,通常需要除以 1024 的三次方來轉換為 GB。

const totalMem = os.totalmem();
const freeMem = os.freemem();

console.log(`系統總記憶體:${(totalMem / 1024 ** 3).toFixed(2)} GB`);
console.log(`當前剩餘記憶體:${(freeMem / 1024 ** 3).toFixed(2)} GB`);
console.log(`快載百分比:${((1 - freeMem / totalMem) * 100).toFixed(1)}%`);

3. 平均負載 (Load Average)

這在 Unix-like 系統(如 Linux/macOS)中非常有用,代表過去 1, 5, 15 分鐘的系統負載趨勢。

console.log('系統平均負載 (1, 5, 15m):', os.loadavg());

系統環境與使用者資訊

1. 平台與運行時間

console.log('平台 (Platform):', os.platform()); // 如 darwin (Mac), win32 (Windows)
console.log('系統類型 (Type):', os.type()); // 如 Windows_NT, Linux, Darwin
console.log('運行時間 (Uptime):', (os.uptime() / 3600).toFixed(1), '小時');

2. 使用者身分

const user = os.userInfo();
console.log(`當前使用者:${user.username}`);
console.log(`家目錄路徑:${user.homedir}`);

網路介面:獲取區域網路 IP

這是開發中非常實用的技巧。當你想讓手機連接電腦上的開發伺服器時,你需要知道電腦在 WiFi 下的內網 IP。

const nets = os.networkInterfaces();
const addresses = [];

for (const name of Object.keys(nets)) {
  for (const net of nets[name]) {
    // 篩選出 IPv4 且非內部迴圈 (Loopback) 的位址
    if (net.family === 'IPv4' && !net.internal) {
      addresses.push(`${name}: ${net.address}`);
    }
  }
}
console.log('偵測到的內網 IP:', addresses);

跨平台工具常數

  • os.EOL:根據作業系統自動切換換行符號(Windows 為 \r\n,Unix 為 \n)。
  • os.homedir():穩定的獲取使用者家目錄方式。
  • os.tmpdir():獲取暫存檔存放路徑。

總結

  1. os 模組是你進行系統調優(如決定 Worker 數量)的資料來源。
  2. 處理跨平台檔案寫入時,務必使用 os.EOL 確保格式正確。
  3. 利用 networkInterfaces() 可以在複雜的網路環境中自動尋找正確的對外 IP。