go读取Linux下cpu占用率、cpu温度、内存占用率及磁盘占用率
在Go语言中,读取Linux系统的CPU占用率、CPU温度、内存占用率以及磁盘占用率涉及到了系统监控和性能分析。以下将详细介绍如何利用Go实现这些功能。 1. **CPU占用率** CPU占用率是指CPU在单位时间内用于执行用户进程的时间比例。在Linux系统中,可以通过`/proc/stat`文件获取这些信息。Go语言可以使用`os`和`ioutil`包来读取该文件,然后解析其内容。以下是一个简单的示例: ```go import ( "bufio" "fmt" "io/ioutil" "os" "strconv" "strings" ) func getCPUPercentage() (float64, error) { file, err := os.Open("/proc/stat") if err != nil { return 0, err } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() if strings.HasPrefix(line, "cpu") { values := strings.Fields(line) user, _ := strconv.ParseUint(values[1], 10, 64) nice, _ := strconv.ParseUint(values[2], 10, 64) sys, _ := strconv.ParseUint(values[3], 10, 64) idle, _ := strconv.ParseUint(values[4], 10, 64) wait, _ := strconv.ParseUint(values[5], 10, 64) total := user + nice + sys + idle + wait return float64(total-idle) / float64(total), nil } } return 0, fmt.Errorf("cpu stats not found") } ``` 2. **CPU温度** CPU温度通常需要通过硬件接口如 `/sys/class/hwmon/hwmonX/tempN_input` 来获取,这里的`X`和`N`是具体设备和传感器的编号。例如,对于常见的lm-sensors库,你可以使用如下方式: ```go import ( "fmt" "io/ioutil" "os" "strconv" ) func getCPUTemperature() (float64, error) { temperatureFile, err := os.Open("/sys/class/hwmon/hwmon0/temp1_input") if err != nil { return 0, err } defer temperatureFile.Close() bytes, err := ioutil.ReadAll(temperatureFile) if err != nil { return 0, err } temp, err := strconv.ParseFloat(strings.TrimSpace(string(bytes)), 64) if err != nil { return 0, err } // 单位转换,假设是摄氏度 return temp / 1000, nil } ``` 3. **内存占用率** 内存占用率可以从`/proc/meminfo`文件中读取。以下代码展示了如何计算内存使用率: ```go import ( "bufio" "fmt" "io/ioutil" "os" "strconv" "strings" ) func getMemoryPercentage() (float64, error) { file, err := os.Open("/proc/meminfo") if err != nil { return 0, err } defer file.Close() scanner := bufio.NewScanner(file) totalMem := 0 freeMem := 0 for scanner.Scan() { line := scanner.Text() fields := strings.Split(line, ":") if fields[0] == "MemTotal" { total, _ := strconv.Atoi(strings.TrimSpace(fields[1])) totalMem = total * 1024 } else if fields[0] == "MemFree" { free, _ := strconv.Atoi(strings.TrimSpace(fields[1])) freeMem = free * 1024 } } return float64(totalMem-freeMem) / float64(totalMem), nil } ``` 4. **磁盘占用率** 磁盘占用率可以通过`/proc/diskstats`或`df`命令获取。以下是一个使用`exec.Command`执行`df`命令的例子: ```go import ( "bytes" "fmt" "log" "os/exec" "regexp" "strconv" ) func getDiskUsage(path string) (float64, error) { cmd := exec.Command("df", "-k", path) var out bytes.Buffer cmd.Stdout = &out err := cmd.Run() if err != nil { return 0, err } re := regexp.MustCompile(`\s+`) lines := strings.Split(out.String(), "\n") for _, line := range lines { fields := re.Split(line, -1) if len(fields) >= 6 && fields[0] != "Filesystem" { used, _ := strconv.Atoi(strings.TrimSuffix(fields[2], "K")) total, _ := strconv.Atoi(strings.TrimSuffix(fields[1], "K")) return float64(used) / float64(total), nil } } return 0, fmt.Errorf("disk usage not found") } ``` 以上代码片段展示了如何使用Go语言读取Linux系统的CPU占用率、CPU温度、内存占用率和磁盘占用率。在实际应用中,这些函数可以被整合到一个统一的系统监控服务中,定期获取和记录这些数据,以便进行性能分析和故障排查。
- 1
- 河豚2022-06-23不是使用系统的库,用的是第三方的库,在获取是瞬间cpu消耗能达到30%,
- 粉丝: 1652
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 操作系统实验ucore lab3
- DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题 下面我将对程序进行详
- final_work_job1(1).sql
- 区块链与联邦学习结合:FedChain项目详细复现指南
- 西门子S7 和 S7 Plus 协议开发示例
- 模块化多电平变流器 MMC 的VSG控制 同步发电机控制 MATLAB–Simulink仿真模型 5电平三相MMC,采用VSG控制 受端接可编辑三相交流源,直流侧接无穷大电源提供调频能量 设置频率
- 微电网(两台)主从控制孤岛-并网平滑切的分析 分析了: 1.孤岛下VF控制 2.并网下PQ控制 3.孤岛下主从控制 4.孤岛到并网的平滑切控制 5.除模型外还对分布式发电与主动配电网一些常见问题做了
- 第四组二手产品.zip
- 基于小程序的智慧物业平台源代码(java+小程序+mysql+LW).zip
- MVIMG_20241222_194113.jpg