//go:build windows // Package collector 提供 Windows 进程 TOP 基础采集能力。 // Logan.Li package collector import ( "encoding/csv" "os/exec" "sort" "strconv" "strings" "ezops/agent/model" ) type ProcessTopCollector struct{} func NewProcessTopCollector() *ProcessTopCollector { return &ProcessTopCollector{} } func (p *ProcessTopCollector) Collect(topN int) ([]model.ProcessStat, error) { out, err := exec.Command("tasklist", "/FO", "CSV", "/NH").Output() if err != nil { return []model.ProcessStat{}, nil } rows, err := csv.NewReader(strings.NewReader(string(out))).ReadAll() if err != nil { return []model.ProcessStat{}, nil } var procs []model.ProcessStat for _, row := range rows { if len(row) < 5 { continue } pid, _ := strconv.Atoi(strings.TrimSpace(row[1])) memKB := parseWindowsMemKB(row[4]) procs = append(procs, model.ProcessStat{ PID: pid, Name: row[0], Cmdline: row[0], User: "", MemoryMB: float64(memKB) / 1024.0, }) } sort.Slice(procs, func(i, j int) bool { return procs[i].MemoryMB > procs[j].MemoryMB }) if topN > len(procs) { topN = len(procs) } if topN < 0 { topN = 0 } return procs[:topN], nil } func parseWindowsMemKB(s string) int64 { clean := strings.NewReplacer(",", "", "K", "", "k", "", " ", "").Replace(s) v, _ := strconv.ParseInt(clean, 10, 64) return v }