// +build darwin package load import ( "context" "os/exec" "strconv" "strings" "github.com/shirou/gopsutil/internal/common" ) func Avg() (*AvgStat, error) { return AvgWithContext(context.Background()) } func AvgWithContext(ctx context.Context) (*AvgStat, error) { values, err := common.DoSysctrlWithContext(ctx, "vm.loadavg") if err != nil { return nil, err } load1, err := strconv.ParseFloat(values[0], 64) if err != nil { return nil, err } load5, err := strconv.ParseFloat(values[1], 64) if err != nil { return nil, err } load15, err := strconv.ParseFloat(values[2], 64) if err != nil { return nil, err } ret := &AvgStat{ Load1: float64(load1), Load5: float64(load5), Load15: float64(load15), } return ret, nil } // Misc returnes miscellaneous host-wide statistics. // darwin use ps command to get process running/blocked count. // Almost same as FreeBSD implementation, but state is different. // U means 'Uninterruptible Sleep'. func Misc() (*MiscStat, error) { return MiscWithContext(context.Background()) } func MiscWithContext(ctx context.Context) (*MiscStat, error) { bin, err := exec.LookPath("ps") if err != nil { return nil, err } out, err := invoke.CommandWithContext(ctx, bin, "axo", "state") if err != nil { return nil, err } lines := strings.Split(string(out), "\n") ret := MiscStat{} for _, l := range lines { if strings.Contains(l, "R") { ret.ProcsRunning++ } else if strings.Contains(l, "U") { // uninterruptible sleep == blocked ret.ProcsBlocked++ } } return &ret, nil }