"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 = "?"
+ Net = map[string]string{}
+ NetM sync.RWMutex
)
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 {
for cols := range bg("top", "-b", "-d", "infinity", "-p", MyPID, "-s", "5", "infinity") {
switch cols[0] {
case "CPU:":
- CPU = strings.ReplaceAll(
- fmt.Sprintf("%s sys:%s int:%s", 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:":
case "Swap:":
if len(cols) >= 5 && cols[4] == "Used," {
Swap = cols[3] + " Swap "
- } else {
- Swap = ""
}
}
}
}
}
-func netstat() {
- for cols := range bg("netstat", "-I", "bridge0", "-n", "1") {
+func netstat(iface, short string) {
+ for cols := range bg("netstat", "-I", iface, "-n", "1") {
if _, err := strconv.Atoi(cols[0]); err != nil {
continue
}
if err != nil {
continue
}
- Net = fmt.Sprintf(
- "%s/%s %s / %s",
- cols[0], cols[4],
+ _ = 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 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)
+ }
}
}
}
}()
go top()
+ go freq()
go iostat()
- go netstat()
+ 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(
- "[%s] [%s] [%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()