X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=main.go;h=20b4d350014c95b1e8fe77d55fa008da4158fc6b;hb=HEAD;hp=0ba2810c5276cc9f931f1a34904dbc1ab9e541a3;hpb=f3ec6964547442f7155a2aa39f244220636a5e5c;p=godwmstat.git diff --git a/main.go b/main.go index 0ba2810..20b4d35 100644 --- a/main.go +++ b/main.go @@ -9,19 +9,23 @@ import ( "os/exec" "strconv" "strings" + "sync" "time" + + "github.com/dustin/go-humanize" ) var ( MyPID string = strconv.Itoa(os.Getpid()) CPU string = "?" + Freq string = "?" Mem string = "?" ARC string = "?" - Swap string = "?" + Swap string = "" Flags string = "?" IOs string = "?" - Net string = "?" - N string = "?" + Net = map[string]string{} + NetM sync.RWMutex ) func piper(c chan []string, name string, args ...string) error { @@ -41,12 +45,9 @@ func piper(c chan []string, name string, args ...string) error { c <- cols } } - if err = scanner.Err(); err != nil { - cmd.Process.Kill() - cmd.Wait() - return err - } - return nil + cmd.Process.Kill() + cmd.Wait() + return scanner.Err() } func bg(cmd string, args ...string) chan []string { @@ -67,49 +68,73 @@ func top() { for cols := range bg("top", "-b", "-d", "infinity", "-p", MyPID, "-s", "5", "infinity") { switch cols[0] { case "CPU:": - CPU = strings.ReplaceAll( - strings.Join([]string{cols[1], cols[5], cols[7]}, " "), - "%", "", - ) + CPU = strings.ReplaceAll(fmt.Sprintf( + "%s sys:%s int:%s n:%s", + cols[1], cols[5], cols[7], cols[3], + ), "%", "") case "Mem:": Mem = strings.ReplaceAll(strings.Join(cols[1:], " "), ",", "") case "ARC:": ARC = cols[1] case "Swap:": - if cols[4] == "Used," { + if len(cols) >= 5 && cols[4] == "Used," { Swap = cols[3] + " Swap " - } else { - Swap = "" } } } } -func iostat(devs ...string) { - stats := make([]string, len(devs)*4) - for i := 0; i < len(devs); i++ { - stats[i*4+1] = "/" - stats[i*4+3] = " " +func iostat() { + var stats []string + for cols := range bg("iostat", "-d", "-w", "1", "-x") { + if cols[0] == "device" { + IOs = strings.Join(stats, " ") + stats = nil + continue + } + if len(cols) < 4 || (cols[1] == "0" && cols[2] == "0") { + continue + } + stats = append(stats, fmt.Sprintf("%s:%s/%s", cols[0], cols[1], cols[2])) } - stats = stats[:len(stats)-1] - for cols := range bg("iostat", append([]string{"-d", "-w", N, "-x"}, devs...)...) { - for i, dev := range devs { - if cols[0] == dev { - stats[i*4+0] = cols[1] - stats[i*4+2] = cols[2] - IOs = strings.Join(stats, "") - } +} + +func netstat(iface, short string) { + for cols := range bg("netstat", "-I", iface, "-n", "1") { + if _, err := strconv.Atoi(cols[0]); err != nil { + continue + } + ibps, err := strconv.Atoi(cols[3]) + if err != nil { + continue } + obps, err := strconv.Atoi(cols[6]) + if err != nil { + continue + } + _ = cols[0] // pkts rx + _ = cols[4] // pkts tx + NetM.Lock() + Net[short] = fmt.Sprintf( + "%s:%s/%s", + short, + humanize.IBytes(uint64(ibps)), + humanize.IBytes(uint64(obps)), + ) + NetM.Unlock() } } -func netstat() { - stats := []string{"0", "0"} - for cols := range bg("netstat", "-n", N) { - if _, err := strconv.Atoi(cols[0]); err == nil { - stats[0] = cols[0] - stats[1] = cols[4] - Net = strings.Join(stats, "/") +func freq() { + for cols := range bg("sysctl", "-n", "dev.cpu.0.freq") { + if strings.HasSuffix(cols[0], "01") { + Freq = "TB" + } else { + raw, err := strconv.Atoi(cols[0]) + if err != nil { + continue + } + Freq = fmt.Sprintf("%.1fG", float64(raw)/1000) } } } @@ -129,10 +154,7 @@ func flagfiles() { func main() { xsetroot := flag.Bool("xsetroot", false, "Call xsetroot") - iodevs := flag.String("iodevs", "ada0 ada1", "iostat devices") - refresh := flag.Uint("refresh", 2, "Refresh interval") flag.Parse() - N = strconv.Itoa(int(*refresh)) go func() { for { flagfiles() @@ -140,24 +162,28 @@ func main() { } }() go top() - go iostat(strings.Split(*iodevs, " ")...) - go netstat() + go freq() + go iostat() + go netstat("bridge0", "br") + go netstat("ix0", "ix") var now time.Time var status string var cmd *exec.Cmd for { now = time.Now() + NetM.RLock() status = fmt.Sprintf( - "[IO %s] [Net %s] [CPU %s] [%s%s %s ARC] [%s] %s", - IOs, Net, CPU, Swap, Mem, ARC, Flags, + "[%s] [%s %s] [%s %s] [%s%s %s ARC] [%s] %s", + IOs, Net["br"], Net["ix"], CPU, Freq, Swap, Mem, ARC, Flags, now.Format("2006-01-02 15:04:05"), ) + NetM.RUnlock() if *xsetroot { cmd = exec.Command("xsetroot", "-name", status) cmd.Run() } else { fmt.Println(status) } - time.Sleep(time.Duration(*refresh) * time.Second) + time.Sleep(time.Second) } }