相信不少 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)
}

转自:https://m.toutiao.com/is/e8BPgmf/