七叶笔记 » golang编程 » Gopsutil – Golang 版本的 psutil

Gopsutil – Golang 版本的 psutil

相信不少 Python 开发者都知道一个开源库 —— psutil,它是一个跨平台的库,提供了便利的获取系统信息的方法,包括 CPU、内存、硬盘等,以及与进程相关的操作,包括进程列表和运行信息等,另外,psutil 还提供了函数形式的命令行工具,包括 ps, top 等。其强大的功能和优秀的跨平台特性,使得开发者可以很轻松地获取系统运行信息,实现系统监控,以及进行进程管理。而 Gopsutil,则是 psutil 的 Go 语言版本,为 Golang 带来了跨平台的系统和进程工具箱。

Gopsutil 库

简介

Gopsutil,是 shirou 在 Github 上开源的 Golang 系统和进程工具库,项目位于 com /shirou/gopsutil,目前版本为 v2.20.9。参照 psutil,gopsutil 实现了绝大部分的功能,并针对不同平台,实现了比较好的跨平台特性,同时,考虑到了 Go 语言自身的特性,实现了大量相关的概念和实体的数据结构,并对不同的功能分模块实现整合。Gopsutil 并未使用 CGo 进行 C 语言接口的直接转换,而是使用原生 Go 语言实现的。 另外,gopsutil 还提供了部分 psutil 没有的功能,提供了更大程度的便利,和更强大的功能。

Gopsutil Github

安装

Gopsutil 要求 Go 1.7 或以上,使用 go get 安装:

 go get github.com/shirou/gopsutil  

Gopsutil 实现了对多个操作系统平台的兼容支持,包括:

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

并部分支持

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

Gopsutil Godoc

示例

Gopsutil 按照功能,区分了子模块进行实现,模块包括:

  • cpu:系统 CPU 信息
  • disk:系统硬盘信息
  • docker :Docker 容器相关的系统信息
  • host: 主机操作系统 运行信息
  • internal /common:共同的工具类接口
  • load:负载统计信息
  • mem:系统内存信息
  • net :网络相关的系统信息
  • process :进程工具箱
  • winservices:Windows 系统服务相关信息

我们来看一个简单的例子:

 package main

import (
    "fmt"

    "github.com/shirou/gopsutil/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 的 mem 模块,通过 mem.VirtualMemory 接口,获取了当前系统的内存信息,并进行打印输出。输出结果如下:

 Total: 3179569152, Free:284233728, UsedPercent:84.508194%
{"total":3179569152,"available":492572672,"used":2895335424,"usedPercent":84.50819439828305, (snip...)}  

Gopsutil 提供了描述进程的类型 Process,定义如下:

 type Process struct {
    Pid int32 `json:"pid"`
    // contains filtered or unexported fields
}  

可以通过 NewProcess 进行新进程的创建:

 func NewProcess(pid int32) (*Process, error)  

通过提供 pid 创建,返回 Process 指针和错误信息。

 package main

import (
    "fmt"
    "github.com/shirou/gopsutil/process"
)

func main() {
    p, _ := process.NewProcess(100)
    fmt.Println(p)
}  

Gopsutil vs psutil

总结

Gopsutil 为 Go 语言提供了 psutil 库的丰富功能,实现了使用 Go 语言获取跨平台的系统信息和进程处理的功能,使得 Go 语言在系统监控和操控方面有了更加强力的工具。

相关文章