package monitor import ( "github.com/shirou/gopsutil/v3/process" "path/filepath" ) // MemoryInfoStat 进程内存信息(RSS/虚拟内存) type MemoryInfoStat struct { Rss uint64 `json:"res"` Vms uint64 `json:"vms"` } // ProcessInfo 进程信息(PID/路径/CPU/内存占用与启动时间) type ProcessInfo struct { Pid int32 `json:"pid"` Name string `json:"name"` ExE string `json:"exe"` Cmd string `json:"cmd"` Cpu float64 `json:"cpu"` Mem MemoryInfoStat `json:"mem"` CreateTime int64 `json:"createTime"` } // GetProcessInfo 获取所有进程信息 func GetProcessInfo() ([]ProcessInfo, error) { v, err := process.Processes() if err != nil { return nil, err } info := make([]ProcessInfo, len(v)) for i, p := range v { name := "" exe, _ := p.Exe() cmd, _ := p.Cmdline() // 先从执行文件中获取进程名 // 如果执行文件为空,再调用 Name() 方式,Name()方式很占用CPU if exe == "" { name, _ = p.Name() } else { name = filepath.Base(exe) } mem, _ := p.MemoryInfo() cpu, _ := p.CPUPercent() createTime, _ := p.CreateTime() p.Times() // 不获取线程数 太占用用CPU // p.NumThreads() info[i].Pid = p.Pid info[i].Name = name info[i].ExE = exe info[i].Cmd = cmd info[i].Cpu = cpu if mem != nil { info[i].Mem = MemoryInfoStat{ Rss: mem.RSS, Vms: mem.VMS, } } info[i].CreateTime = createTime if name == "QQ.exe" { //fmt.Printf("Pid:%d name:%s exe:%s\n", p.Pid, name, exe) //fmt.Printf("工作集:%d 提交大小:%d\n", mem.RSS, mem.VMS) //fmt.Printf("CPU:%.2f%% \n", cpu) } } if err != nil { return nil, err } return info, nil }