使用gopsutil获取OS信息

生产环境通常需要掌握主机硬盘、CPU、内存、进程等资源使用情况,可以执行系统命令获得,通过os/exec执行命令,如:ps,cd,top,然后解析命令执行结果。对于linux操作系统,一切都是文件,更直接的方法是从相关文件读取,例如/proc目录中的内容。

上述方法能够满足需求,但需要重复创建工具,因为已经有第三方库完美地实现了这些功能,这就是本文要介绍的gopsutil库。

介绍gopsutil库

psutil (process and system utilities)是Python实现的跨平台库,用于获取进程和系统信息工具(CPU, memory, disk, network, sensors),gopsutil是Go语言实现版本。

gopsutil屏蔽了不同系统的差异,有良好的可移植性。支持下面操作系统:

  • FreeBSD i386/amd64/arm
  • Linux i386/amd64/arm(raspberry pi)
  • Windows i386/amd64/arm/arm64
  • Darwin i386/amd64
  • OpenBSD amd64
  • Solaris amd64

部分支持:

  • CPU on DragonFly BSD
  • host on Linux RISC-V

另外,通过移植C结构体至Go,gopsutil没有cgo代码,跨平台编译更容易。

使用示例

gopsutil有V3和V2版本,不保证向后兼容,所以有两种使用方式。


import (
    // "github.com/shirou/gopsutil/v3/mem" // to use v3
    "github.com/shirou/gopsutil/mem"  
)
  • 获取内容使用信息
package main

import (
    "fmt"

    "github.com/shirou/gopsutil/v3/mem"
)

func main() {
    v, _ := mem.VirtualMemory()

    // almost every return value is a struct
    fmt.Printf("Total: %v, Free:%v, UsedPercent:%f%%\n", v.Total, v.Free, v.UsedPercent)

    // convert to JSON. String() is also implemented
    fmt.Println(v)
}

gopsutil包一个友好特性是大多数收集函数返回结构体对象,实现了fmt.Stringer接口,所以返回json格式。举例,上面示例返回VirtualMemoryStat 结构体,在String方法中调用了json.Marshal()函数。

type VirtualMemoryStat struct {
 Total uint64 `json:"total"`
 Available uint64 `json:"available"`
 Used uint64 `json:"used"`
 UsedPercent float64 `json:"usedPercent"`
 Free uint64 `json:"free"`
 Active   uint64 `json:"active"`
 Inactive uint64 `json:"inactive"`
 Wired    uint64 `json:"wired"`

func (m VirtualMemoryStat) String() string {
 s, _ := json.Marshal(m)
 return string(s)
}

Gopsutil根据不同的采集单元分为不同的子包,在使用中可以通过引入不同的子包调用相关的方法。

import (
 "github.com/shirou/gopsutil/v3/mem"
 "github.com/shirou/gopsutil/v3/cpu"
 "github.com/shirou/gopsutil/v3/disk"
 "github.com/shirou/gopsutil/v3/docker"
 "github.com/shirou/gopsutil/v3/host"
 "github.com/shirou/gopsutil/v3/internal"
 "github.com/shirou/gopsutil/v3/load"
 "github.com/shirou/gopsutil/v3/mem"
 "github.com/shirou/gopsutil/v3/net"
 "github.com/shirou/gopsutil/v3/process"
 "github.com/shirou/gopsutil/v3/winservices"
)

举例,如果想获取主机信息,需要使用github.com/shirou/gopsutil/v3/host子包:

import (
 "fmt"
 "github.com/shirou/gopsutil/v3/host"
)

func main() {
 hostInfo, _ := host.Info()
 fmt.Println(hostInfo)
}

总结

gopsutil库的功能非常全面,包括主机、磁盘、内存、CPU、网络、进程、docker等模块,它可以很好地帮助我们获取系统信息。并且gopsutil处理跨平台兼容性问题,外部接口基本一致,对开发者友好。
参考文档:https://github.com/shirou/gopsutil

猜你喜欢

转载自blog.csdn.net/neweastsun/article/details/130442470
今日推荐