商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何用Go语言编写Linux系统监控工具

如何用Go语言编写Linux系统监控工具

  发布于2026-07-05 阅读(0)

扫一扫,手机访问

在Linux系统运维中,实时掌握CPU、内存和磁盘的使用情况,可以说是最基础也最刚需的操作之一。用Go语言自己动手写一个监控工具,并没有想象中那么复杂——你只需要熟悉几条常用的Linux命令,再结合Go在文件操作、并发控制和网络编程方面的能力,就能搭起一个可用的框架。下面这个示例会一步步带你走通整个过程。

如何用Go语言编写Linux系统监控工具

  1. 首先确认你的开发环境已经装好了Go语言。如果还没有,可以去 https://golang.org/dl/ 下载并安装,这一步没什么好绕的。

  2. 新建一个Go源文件,比如叫 system_monitor.go

  3. 把下面的代码贴进去:

    package main
    
    import (
        "bufio"
        "fmt"
        "os/exec"
        "strings"
        "time"
    )
    
    func getCPUUsage() (string, error) {
        cmd := exec.Command("top", "-bn1")
        output, err := cmd.Output()
        if err != nil {
            return "", err
        }
        scanner := bufio.NewScanner(strings.NewReader(string(output)))
        for scanner.Scan() {
            if strings.Contains(scanner.Text(), "%Cpu(s):") {
                return strings.TrimSpace(strings.Split(scanner.Text(), ":")[1]), nil
            }
        }
        return "", fmt.Errorf("无法获取CPU使用率")
    }
    
    func getMemoryUsage() (string, error) {
        cmd := exec.Command("free", "-m")
        output, err := cmd.Output()
        if err != nil {
            return "", err
        }
        scanner := bufio.NewScanner(strings.NewReader(string(output)))
        for scanner.Scan() {
            if strings.Contains(scanner.Text(), "Mem:") {
                memInfo := strings.Fields(scanner.Text())
                // 注意:这里需要将字符串转换为float64来计算百分比
                return fmt.Sprintf("%s/%sMB (%.2f%%)", memInfo[1], memInfo[2], 
                    float64(stringToInt(memInfo[2])-stringToInt(memInfo[3]))/float64(stringToInt(memInfo[2]))*100), nil
            }
        }
        return "", fmt.Errorf("无法获取内存使用情况")
    }
    
    // 辅助函数:将字符串转为int
    func stringToInt(s string) int {
        // 为了简洁,这里只做示例,实际生产需处理错误
        i := 0
        fmt.Sscanf(s, "%d", &i)
        return i
    }
    
    func getDiskUsage() (string, error) {
        cmd := exec.Command("df", "-h")
        output, err := cmd.Output()
        if err != nil {
            return "", err
        }
        scanner := bufio.NewScanner(strings.NewReader(string(output)))
        for scanner.Scan() {
            if strings.Contains(scanner.Text(), "/dev/") {
                diskInfo := strings.Fields(scanner.Text())
                return diskInfo[0], nil
            }
        }
        return "", fmt.Errorf("无法获取磁盘使用情况")
    }
    
    func main() {
        for {
            cpuUsage, err := getCPUUsage()
            if err != nil {
                fmt.Println("错误:", err)
            } else {
                fmt.Printf("CPU使用率: %s\n", cpuUsage)
            }
    
            memoryUsage, err := getMemoryUsage()
            if err != nil {
                fmt.Println("错误:", err)
            } else {
                fmt.Printf("内存使用情况: %s\n", memoryUsage)
            }
    
            diskUsage, err := getDiskUsage()
            if err != nil {
                fmt.Println("错误:", err)
            } else {
                fmt.Printf("磁盘使用情况: %s\n", diskUsage)
            }
    
            time.Sleep(2 * time.Second)
        }
    }
  4. 保存文件后,在终端里执行 go run system_monitor.go,你就能看到每两秒刷新一次的CPU、内存和磁盘使用数据了。

当然,这只是一个最基础的起点。如果你想让工具更实用,完全可以往里加网络流量监控、进程活动追踪,甚至用Web界面展示。别忘了,Go生态里还有一个非常成熟的系统监控库 github.com/shirou/gopsutil,它能帮你省掉很多直接解析命令输出的麻烦。不过从零开始写一遍,反而更能理解底层是怎么运作的,不是吗?

本文转载于:https://www.yisu.com/ask/8970295.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注