Go语言在Linux下获取系统进程CPU使用率的方法
介绍如何利用Go语言的执行命令包调用Linux `ps` 工具,解析其输出以获取当前系统各进程的CPU占用百分比。
原理与目标
在Linux环境下,获取进程资源占用情况最直接的方式是借助现有的系统命令行工具。本文将演示如何使用Go语言的 os/exec 包执行 ps aux 命令,捕获其控制台输出,并通过字符串分割逻辑解析出每个进程的PID(进程ID)及其对应的CPU使用率百分比。
准备条件
- 操作系统:Linux(支持
ps命令的系统)。 - 开发环境:已安装Go编译器。
- 权限:执行该脚本的用户需要具有查看系统进程列表的权限。
第1步:定义数据结构
为了清晰地存储从系统获取的数据,首先定义一个表示进程信息的结构体,包含进程ID和CPU使用率两个字段:
type Process struct {
pid int
cpu float64
}
第2步:执行系统命令
使用 exec.Command 创建运行 ps aux 的指令实例,并绑定一个缓冲区域用于接收标准输出:
cmd := exec.Command("ps", "aux")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
第3步:解析进程数据
逐行读取缓冲区的输出内容。针对每一行,通过分隔符拆分子项,去除空字符后,提取关键列:
- PID:通常位于数组的第二列(索引1),需转换为整型。
- CPU%:通常位于数组的第三列(索引2),需转换为浮点型。
processes := make([]*Process, 0)
for {
line, err := out.ReadString('\n')
if err!=nil {
break
}
tokens := strings.Split(line, " ")
ft := make([]string, 0)
for _, t := range(tokens) {
if t!="" && t!="\t" {
ft = append(ft, t)
}
}
// 跳过标题行或非预期格式行
if len(ft) < 3 {
continue
}
pid, err := strconv.Atoi(ft[1])
if err!=nil {
continue // 若PID解析失败则跳过该行
}
cpu, err := strconv.ParseFloat(ft[2], 64)
if err!=nil {
log.Printf("CPU parse error: %v", err)
continue
}
processes = append(processes, &Process{pid, cpu})
}
第4步:输出结果
遍历收集到的进程列表,将结果打印到日志或控制台,以供后续分析或监控使用:
for _, p := range(processes) {
log.Println("Process", p.pid, "takes", p.cpu, "% of the CPU")
}
注意事项与排错
- 并发与延迟:
ps aux展示的是某一瞬间的状态快照,并非连续监测。如需实时数据,建议在循环中配合时间间隔调用此方法。 - 解析差异:不同版本的Linux或不同的 locale 设置可能会导致
ps输出的列宽和顺序略有变化,生产环境中建议确认实际输出的列序索引。 - 性能消耗:频繁调用外部命令会有一定开销,对于大规模高频率监控场景,建议直接解析
/proc/[pid]/stat文件或使用专门的系统监控库(如gopsutil)。
总结
上述方法提供了一种简单直接的途径,在不引入第三方依赖的情况下,利用Go语言的标准库功能在Linux系统中抓取进程CPU占用信息。以上就是在Linux下通过Go语言获得系统进程cpu使用情况的详细内容,更多关于Go语言系统监控的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













