func (p *Process) Exe() (string, error) { query := fmt.Sprintf("ProcessId = %d", p.Pid) lines, err := common.GetWmic("process", "where", query, "get", "ExecutablePath") if err != nil { return "", err } if len(lines) == 0 { return "", fmt.Errorf("could not get ExecutablePath") } return lines[0][1], nil }
func BootTime() (uint64, error) { lines, err := common.GetWmic("os", "get", "LastBootUpTime") if err != nil { return 0, err } if len(lines) == 0 || len(lines[0]) != 2 { return 0, fmt.Errorf("could not get LastBootUpTime") } format := "20060102150405" t, err := time.Parse(format, strings.Split(lines[0][1], ".")[0]) if err != nil { return 0, err } now := time.Now() return uint64(now.Sub(t).Seconds()), nil }
func (p *Process) NumThreads() (int32, error) { query := fmt.Sprintf("ProcessId = %d", p.Pid) lines, err := common.GetWmic("process", "where", query, "get", "ThreadCount") if err != nil { return 0, err } if len(lines) == 0 { return 0, fmt.Errorf("could not get command line") } count, err := strconv.Atoi(lines[0][1]) if err != nil { return 0, err } return int32(count), nil }
func CPUPercent(interval time.Duration, percpu bool) ([]float64, error) { ret := []float64{} lines, err := common.GetWmic("cpu", "get", "loadpercentage") if err != nil { return ret, err } for _, l := range lines { if len(l) < 2 { continue } p, err := strconv.Atoi(l[1]) if err != nil { p = 0 } // but windows can only get one percent. ret = append(ret, float64(p)/100.0) } return ret, nil }
// Get processes func processes() ([]*Process, error) { lines, err := common.GetWmic("process", "get", "processid") if err != nil { return nil, err } var results []*Process for _, l := range lines { pid, err := strconv.Atoi(l[1]) if err != nil { continue } p, err := NewProcess(int32(pid)) if err != nil { continue } results = append(results, p) } return results, nil }
func CPUInfo() ([]CPUInfoStat, error) { var ret []CPUInfoStat lines, err := common.GetWmic("cpu", "get", "Family,L2CacheSize,Manufacturer,Name,NumberOfLogicalProcessors,ProcessorId,Stepping") if err != nil { return ret, err } for i, t := range lines { cache, err := strconv.Atoi(t[2]) if err != nil { cache = 0 } cores, err := strconv.Atoi(t[5]) if err != nil { cores = 0 } stepping := 0 if len(t) > 7 { stepping, err = strconv.Atoi(t[6]) if err != nil { stepping = 0 } } cpu := CPUInfoStat{ CPU: int32(i), Family: t[1], CacheSize: int32(cache), VendorID: t[3], ModelName: t[4], Cores: int32(cores), PhysicalID: t[6], Stepping: int32(stepping), Flags: []string{}, } ret = append(ret, cpu) } return ret, nil }