| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- // +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
- }
|