Node获取服务器信息

在日常开发中,可能会遇到需要实时监控服务器运行信息,用来监控服务器运行情况,是否需要进行服务器的改配等操作。虽然服务器提供平台会有一系列监控数据,但是运营人员不可能频繁的登录控制台来查看服务器运行情况,所以需要在管理系统上展示出服务器的基本运行情况。如:CPU的占用率、内存的占用率、磁盘使用率、系统负载、运行时长等一系列信息。

获取CPU的占用情况


const getCPU = async () => {
  function cpuAverage() {
    // Initialise sum of idle and time of cores and fetch CPU info
    var totalIdle = 0, totalTick = 0;
    var cpus = os.cpus();
    // Loop through CPU cores
    for(var i = 0, len = cpus.length; i < len; i++) {
      // Select CPU core
      var cpu = cpus[i];
      // Total up the time in the cores tick
      for(const type in cpu.times) {
        totalTick += cpu.times[type];
     }     
      // Total up the idle time of the core
      totalIdle += cpu.times.idle;
    }
    // Return the average Idle and Tick times
    return { idle: totalIdle / cpus.length,  total: totalTick / cpus.length };
  }

  const startMeasure = cpuAverage();
  return new Promise((resolve) => {
    setTimeout(function() { 
      // Grab second Measure
      var endMeasure = cpuAverage(); 
      // Calculate the difference in idle and total time between the measures
      var idleDifference = endMeasure.idle - startMeasure.idle;
      var totalDifference = endMeasure.total - startMeasure.total;
      // Calculate the average percentage CPU usage
      var percentageCPU = 100 - ~~(100 * idleDifference / totalDifference);
      // Output the result
      resolve({ used: percentageCPU, name: os.cpus()[0].model, threadNumber: os.cpus().length });
    }, 100);
  });
}

获取内存占用情况

在多次测试中发现Node提供的内存API所计算的内存占用数据存在较大的偏差,所以此处使用系统命令来获取相应的数据。(但是在windows与macOS上目前没有找到好的解决方案,所以此处使用Node提供的API来处理


const getMem = async () => {
  return new Promise(async (resolve) => {
    // 初始化内存总量、空闲总量、使用总量与占用率
    let totalmem = 0,
      freemem = 0,
      usedmem = 0,
      usageRate = 0;
    
    // 判断操作系统
    if (os.type() === 'Linux') {
      // 执行系统命令,命令输出结果如下图
      const { stdout } = await exec('free -m');
      // 获取到输出数据后截取计算所需要的信息
      let str = stdout.split('\n')[1].split(' ').filter(item => item != '');

      totalmem = str[1];
      freemem = str[1] - str[2];
      usedmem = str[2];
      // 计算占用率
      usageRate = (usedmem / totalmem * 100).toFixed(2);
    } else {
      totalmem = (os.totalmem() / 1024 / 1024 / 1024).toFixed(2);
      freemem = (os.freemem() / 1024 / 1024 / 1024).toFixed(2);
      usedmem = ((os.totalmem() - os.freemem()) / 1024 / 1024 / 1024).toFixed(2);
      usageRate = parseInt(usedmem / totalmem * 100);
    }
    // 返回计算结果
    resolve({ totalmem, freemem, usedmem, usageRate });
  })
}

获取服务器基本信息


sys = async () => {
  let date = '',sys = '';
    
  // 获取系统运行时间
  const time = os.uptime();
  const day = Math.floor(time / 86400);
  const hour = Math.floor((time - day * 86400) / 3600);
  const minute = Math.floor((time - day * 86400 - hour * 3600) / 60);
  const second = Math.floor(time - day * 86400 - hour * 3600 - minute * 60);
  // 时间格式化
  date = formatStr('{0}天{1}时{2}分{3}秒', day, hour, minute, second);

  // 获取系统版本
  if (os.type() === 'Linux') {
    // 调用系统命令来获取系统的版本信息
    const { stdout } = await exec('cat /etc/redhat-release');
    sys = stdout.trim();
  } else if (os.type() === 'Darwin') {
    const { stdout } = await exec('sw_vers');
    stdout.split('\n').forEach(item => {
      sys += item.split(':')[1] ? item.split(':')[1] : '';
    })
    sys = sys.trim();
  } else if (os.type() === 'Windows_NT') {
    const { stdout } = await exec('ver');
    sys = stdout.trim();
  }

  // 获取系统负载
  const loadavg = os.loadavg();
  // 1分钟负载
  const loadavg1m = loadavg[0].toFixed(2);
  // 5分钟负载
  const loadavg5m = loadavg[1].toFixed(2);
  // 10分钟负载
  const loadavg12m = loadavg[2].toFixed(2);

  // 返回基本信息数据
  return Promise.resolve({ date, sys, loadavg1m, loadavg5m, loadavg12m });
}

获取磁盘使用情况

与内存一样,通过调用系统的命令来获取到总数据,并通过截取来获取具体值。(目前只能获取Linux(挂在盘未进行获取)系统的使用情况


const getDisk = async () => {
  let total = 0,
    available = 0,
    used = 0,
    usageRate = 0;
  if (os.type() === 'Linux') {
    let { stdout } = await exec('df -hl /');
    stdout = stdout.split('\n')[1].split(' ').filter(item => item != '');

    total = stdout[1];
    available = stdout[3];
    used = parseFloat(stdout[1]) * (parseFloat(stdout[4]) / 100);
    usageRate = parseFloat(stdout[4]);
  }

  return Promise.resolve({ total, available, used, usageRate });
}

当然也有一些开源工具包可以用来获取相应的数据,笔者只是做一个记录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将React应用程序连接到Node.js服务器,可以使用以下步骤: 1. 在React应用程序的根目录中,使用终端或命令提示符打开一个新的命令窗口。 2. 使用以下命令初始化一个新的React应用程序: ``` npx create-react-app my-app ``` 这将创建一个名为 "my-app" 的新React应用程序。 3. 安装与Node.js服务器相关的依赖项。在React应用程序的根目录中运行以下命令: ``` npm install express axios ``` 这将安装Express和Axios模块,用于在React应用程序中处理服务器请求和响应。 4. 创建一个新的文件夹,用于存放服务器文件。在React应用程序的根目录中创建一个名为 "server" 的文件夹。 5. 在 "server" 文件夹中创建一个新的JavaScript文件,例如 "server.js"。在该文件中,编写以下代码来创建一个简单的Node.js服务器: ```javascript const express = require('express'); const app = express(); app.get('/api/data', (req, res) => { res.json({ message: 'Hello from the server!' }); }); const port = process.env.PORT || 5000; app.listen(port, () => { console.log(`Server listening on port ${port}`); }); ``` 这个简单的服务器会在根路径下的 "/api/data" 路由上返回一个包含消息 "Hello from the server!" 的JSON响应。 6. 在React应用程序的根目录中的 "src" 文件夹中创建一个新的文件,例如 "api.js"。在该文件中,编写以下代码来处理从服务器获取数据的逻辑: ```javascript import axios from 'axios'; export const fetchData = async () => { try { const response = await axios.get('/api/data'); return response.data; } catch (error) { console.error('Error fetching data:', error); } }; ``` 这个代码片段使用Axios库来发送GET请求到服务器的 "/api/data" 路由,并返回响应数据。 7. 在React组件中使用从服务器获取的数据。在React应用程序的根组件或其他需要数据的组件中,使用以下代码来获取并显示从服务器返回的数据: ```javascript import React, { useEffect, useState } from 'react'; import { fetchData } from './api'; const App = () => { const [data, setData] = useState(null); useEffect(() => { const getData = async () => { const result = await fetchData(); setData(result); }; getData(); }, []); return ( <div> {data ? <p>{data.message}</p> : <p>Loading...</p>} </div> ); }; export default App; ``` 这个组件使用React的 `useEffect` 钩子和 `useState` 钩子来在组件加载时获取数据,并将其存储在状态变量 `data` 中。然后,根据数据是否存在,显示相应的消息或 "Loading..." 文本。 8. 启动React应用程序和Node.js服务器。在React应用程序的根目录中,分别在两个不同的终端或命令提示符窗口中运行以下命令: ``` npm start ``` ``` node server/server.js ``` `npm start` 命令将启动React开发服务器,而 `node server/server.js` 命令将启动Node.js服务器。 现在,React应用程序将通过Axios库从Node.js服务器获取数据,并在应用程序中显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑狼传说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值