相信不少 Python 开发者都知道一个开源库 —— psutil,它是一个跨平台的库,提供了便利的获取系统信息的方法,包括 CPU、内存、硬盘等,以及与进程相关的操作,包括进程列表和运行信息等,另外,psutil 还提供了函数形式的命令行工具,包括 ps, top 等。其强大的功能和优秀的跨平台特性,使得开发者可以很轻松地获取系统运行信息,实现系统监控,以及进行进程管理。而 Gopsutil,则是 psutil 的 Go 语言版本,为 Golang 带来了跨平台的系统和进程工具箱。
简介
Gopsutil,是 shirou 在 Github 上开源的 Golang 系统和进程工具库,项目位于 https://github.com/shirou/gopsutil, 目前版本为 v2.20.9。参照 psutil,gopsutil 实现了绝大部分的功能,并针对不同平台,实现了比较好的跨平台特性,同时,考虑到了 Go 语言自身的特性,实现了大量相关的概念和实体的数据结构,并对不同的功能分模块实现整合。Gopsutil 并未使用 CGo 进行 C 语言接口的直接转换,而是使用原生 Go 语言实现的。 另外,gopsutil 还提供了部分 psutil 没有的功能,提供了更大程度的便利,和更强大的功能。
v3迁移
从v3.20.10开始,gopsutil变为v3,从而破坏了后退兼容性。请参阅https://github.com/shirou/gopsutil。
安装
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 按照功能,区分了子模块进行实现,模块包括:
- 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)
}