Node内置模块 【操作系统os模块】

简介: Node内置模块 【操作系统os模块】

🌟前言

哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天我们带领大家初识一下 Node内置模块 操作系统os模块 ;让我们一起来看看吧🤘


🌟os模块

os 模块提供了与操作系统相关的实用方法和属性


🌟使用

我们可以通过以下方式引入该模块:


var os = require("os")

🌟属性

属性名 描述
os.EOL 返回操作系统特定的行末标志,可能返回的值为’\n’


🌟方法

1685514145954.png

🌟获取操作系统临时目录

os.tmpdir()该方法用于获取操作系统中默认的用于存放临时文件的目录。

os.tmpdir()
// 输出:/var/folders/9c/cx_t8sf14rz625px11rj3pl40000gn/T

🌟获取操作系统CPU架构

CPU架构是CPU商给CPU产品定的一个规范,主要目的是为了区分不同类型的CPU。目前市场上的CPU分类主要分有两大阵营,一个是intel、AMD为首的复杂指令集CPU,另一个是以IBM、ARM为首的精简指令集CPU。不同品牌的CPU,其产品的架构也不相同,Intel、AMD的CPU是X86架构,IBM公司的CPU是PowerPC架构,ARM公司的CPU是ARM架构,国内的飞腾CPU也是ARM架构。此外还有MPIS架构、SPARC架构、Alpha架构。


X86架构: X86架构(The X86 architecture)是微处理器执行的计算机语言指令集。x86架构CPU主要应用领域:个人计算机、服务器等。在PC端市场Wintel组合(windows系统 + intel处理器)占据了大部分江山,另外一部分有ADM占领。而x64的全称叫x86-64,也就是说x64是x86架构的64位cpu。

ARM架构:ARM架构,也称作进阶精简指令集机器,是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。由于节能的特点,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性。ARM架构主要应用领域:手机端CPU和MCU,手机CPU市场,由高通骁龙系列、华为麒麟系列、以及三星猎户系列和联发科系列,

🌟识别操作系统平台

nodejs 提供了os.platform()和os.type(),可以用来识别操作系统平台。


os.platform()该方法用于获取操作系统平台,可能返回的值为’darwin’、‘linux’、‘win32’

os.type()该方法用于获取操作系统类型。在 Linux 上返回 ‘Linux’,在 macOS 上返回 ‘Darwin’,在 Windows 上返回 ‘Windows_NT’。

推荐使用os.platform():

let platforms = {darwin:'MacOSX',linux:'Linux','win32':'Windows'}
let type = os.platform()
// 获取Platform    当前:darwin
platforms[type]   
//输出:MacOSX

🌟获取操作系统发行版本

os.release() 该方法用于获取操作系统的发行版本。

在Windows系统获取操作系统发行版本:

const release = os.release();  // 输出:6.3     主版本.次版本
console.log(release)

1685514381465.png

但在 MacOSX 上,os.release()得到的结果不准确,建议采用以下方式:

const { execSync } = require('child_process')
const macVersion = execSync('sw_vers -productVersion', { encoding: 'utf-8' })
console.log(release)
//输出:12.1

🌟理解和计算“平均负载”

平均负载是指:单位时间内,系统处于可运行状态和不可中断状态的平均进程数。它和 cpu 使用率没有直接关系。


其中,这里的可运行状态指的是:正在使用 cpu 或正在等待 cpu 的进程。不可中断状态指的是:内核态关键流程中的进程。


在 nodejs 中,直接调用os.loadavg()可以获得 1、5 和 15 分钟的平均负载,它和 unix 命令uptime返回值一样。


为什么需要关心平均负载这个问题呢?因为进程分为 2 种,第一种就是“CPU 密集型”,它的 cpu 使用率和平均负载都是高的;第二种是“IO 密集型”,它的 cpu 使用率不一定高,但是等待 IO 会造成平均负载高。所以,cpu 使用率和平均负载共同反应系统性能。


平均活跃进程数最理想的状态是 cpu 数量=平均负载,如果 cpu 数量 < 平均负载,那么平均负载过高。


// 判断是否平均负载过高
function isHighLoad() {
    const cpuNum = os.cpus().length;
    return os.loadavg().map(item => item > cpuNum);
}

🌟理解和计算“cpu 使用率”

很多监控软件都提供针对 cpu 使用率的“实时”监控,当然这个实时不是真的实时,有个时间差。这个功能,nodejs 如何实现呢?

第一步:封装getCPUInfo(),计算获取 cpu 花费的总时间与空闲模式花费的时间。

/**
 * 获取cpu花费的总时间与空闲模式的时间
 */
function getCPUInfo() {
    const cpus = os.cpus();
    let user = 0,
        nice = 0,
        sys = 0,
        idle = 0,
        irq = 0,
        total = 0;
    cpus.forEach(cpu => {
        const { times } = cpu;
        user += times.user;
        nice += times.nice;
        sys += times.sys;
        idle += times.idle;
        irq += times.irq;
    });
    total = user + nice + sys + idle + irq;
    return {
        total,
        idle
    };
}

第二步:当前时间点 t1,选定一个时间差 intervel,计算 t1 和 t1 + interval 这两个时间点的 cpu 时间差与空闲模式时间差,返回 1 - 空闲时间差 / cpu时间差。返回的结果就是时间差 intervel 内的平均 cpu 使用率。

function getCPUUsage(interval = 1000) {
    const startInfo = getCPUInfo();
    return new Promise(resolve => {
        setTimeout(() => {
            const endInfo = getCPUInfo();
            const idleDiff = startInfo.idle - endInfo.idle;
            const totalDiff = startInfo.total - endInfo.total;
            resolve(1 - Math.abs(idleDiff / totalDiff));
        }, interval);
    });
}

使用方式如下:

getCPUUsage().then(usage => console.log("cpu使用率:", usage));

🌟理解和计算“内存使用率”

cpu 的指标有平均负载、cpu 使用率,内存的指标有内存使用率。

// 返回系统的总内存量,单位为字节
os.totalmem()
// 返回系统的空闲内存量,单位为字节
os.freemem()

借助 nodejs 接口,实现内存使用率:

/**
 * 获取内存使用率
 * @returns 内存使用率
 */
function getMemUsage() {
    return 1 - os.freemem() / os.totalmem();
}
/**
 * 将字节转换为其他类型值
 * @param {*} size 转换字节数
 * @param {*} type 转换目标,可用类型 kb,mb,gb
 * @returns 转换后的大小
 */
function byteTo(size,type='kb') {
    var rules = {
        kb: 1024,
        mb: 1024 * 1024,
        gb: 1024 * 1024 * 1024
    }
    return size / rules[type]
}
byteTo(getMemUsage(),'mb')   // 内存使用率 输出: xxMB

🌟获取CPU信息

os.cpus() 该方法返回一个数组,包含所安装的每个 CPU/内核的信息:型号、速度(单位 MHz)、时间(一个包含 user、nice、sys、idle 和 irq 所使用 CPU/内核毫秒数的对象)。

console.log(os.cpus())

输出结果:

[
  {
    model: 'Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz',
    speed: 2700,
    times: { user: 18665060, nice: 0, sys: 11753350, idle: 33536690, irq: 0 }
  },
  {
    model: 'Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz',
    speed: 2700,
    times: { user: 9616620, nice: 0, sys: 5249430, idle: 49073350, irq: 0 }
  },
  {
    model: 'Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz',
    speed: 2700,
    times: { user: 17431130, nice: 0, sys: 10963700, idle: 35544600, irq: 0 }
  },
  {
    model: 'Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz',
    speed: 2700,
    times: { user: 8412530, nice: 0, sys: 4786440, idle: 50740410, irq: 0 }
  }
]

🌟获取CPU核心数及CPU信息:

console.log('CPU核心数量:',os.cpus().length) // 输出:4
console.log('CPU信息:',os.cpus()[0].model)  // 输出:Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz

🌟查看运行时间

🌟nodejs 运行时间

process.uptime()

🌟系统运行时间

os.uptime()

🌟查看网络接口列表

获得网络接口列表的方法如下所示:

os.networkInterfaces()
{
    lo: [
        {
            address: '127.0.0.1',
            netmask: '255.0.0.0',
            family: 'IPv4',
            mac: '00:00:00:00:00:00',
            internal: true
        },
        {
            address: '::1',
            netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
            family: 'IPv6',
            mac: '00:00:00:00:00:00',
            internal: true
        }
    ],
    eth0: [
        {
            address: '192.168.1.108',
            netmask: '255.255.255.0',
            family: 'IPv4',
            mac: '01:02:03:0a:0b:0c',
            internal: false
        },
        {
            address: 'fe80::a00:27ff:fe4e:66a1',
            netmask: 'ffff:ffff:ffff:ffff::',
            family: 'IPv6',
            mac: '01:02:03:0a:0b:0c',
            internal: false
        }
    ]
}

🌟写在最后

更多Node知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
3天前
|
存储 人工智能 运维
|
24天前
|
缓存 JavaScript 安全
nodejs里面的http模块介绍和使用
综上所述,Node.js的http模块是构建Web服务的基础,其灵活性和强大功能,结合Node.js异步非阻塞的特点,为现代Web应用开发提供了坚实的基础。
100 62
|
2天前
|
存储 人工智能 自然语言处理
OS Copilot&quot;作为一款操作系统辅助软件应运而生,旨在提升用户使用电脑的效率
随着AI技术的发展,&quot;OS Copilot&quot;作为一款操作系统辅助软件应运而生,旨在提升用户使用电脑的效率。它具备智能命令建议、代码片段生成、文件管理助手及任务自动化等功能,适合日常办公与专业开发。安装简便,上手容易,能显著提高工作效率。
11 3
|
23天前
|
存储 人工智能 自然语言处理
“OS Copilot”的操作系统辅助软件
【10月更文挑战第7天】随着AI技术的发展,&quot;OS Copilot&quot;作为一款操作系统辅助软件,通过智能命令建议、代码片段生成、文件管理助手及任务自动化等功能,极大提升了用户的工作效率,无论是日常办公还是专业开发都提供了强有力的支持。其简洁的安装流程、友好的用户界面和强大的搜索能力,使得这款软件成为提升生产力的得力助手。
37 2
|
23天前
|
Python
Python实用记录(四):os模块-去后缀或者改后缀/指定目录下图片或者子目录图片写入txt/csv
本文介绍了如何使用Python的os模块来操作文件,包括更改文件后缀、分割文件路径和后缀、将指定目录下的所有图片写入txt文档,以及将指定目录下所有子目录中的图片写入csv文档,并为每个子目录分配一个标签。
14 1
|
26天前
|
缓存 JSON JavaScript
Node.js模块系统
10月更文挑战第4天
34 2
|
23天前
|
JavaScript 应用服务中间件 Apache
Node.js Web 模块
10月更文挑战第7天
28 0
|
23天前
|
JavaScript 网络协议
Node.js 工具模块
10月更文挑战第7天
19 0
|
24天前
|
Shell Python
Python中os模块的常用方法和示例
在Python中,`os`模块提供了与操作系统交互的函数,用于文件和目录管理、路径操作、环境变量等。常用方法包括路径操作(如`os.path.join()`、`os.path.abspath()`)、文件和目录管理(如`os.mkdir()`、`os.remove()`)、环境变量和进程管理(如`os.getenv()`、`os.system()`)以及其他常用功能(如`os.getcwd()`、`os.urandom()`)。
24 0
|
29天前
|
JavaScript 前端开发 应用服务中间件
Node.js Web 模块
Node.js Web 模块