16 MyPID string = strconv.Itoa(os.Getpid())
27 func piper(c chan []string, name string, args ...string) error {
28 cmd := exec.Command(name, args...)
29 r, err := cmd.StdoutPipe()
37 scanner := bufio.NewScanner(r)
39 cols := strings.Fields(scanner.Text())
44 if err = scanner.Err(); err != nil {
52 func bg(cmd string, args ...string) chan []string {
53 c := make(chan []string)
56 err := piper(c, cmd, args...)
58 log.Println("error:", cmd, ":", err)
60 time.Sleep(time.Second)
67 for cols := range bg("top", "-b", "-d", "infinity", "-p", MyPID, "-s", "5", "infinity") {
70 CPU = strings.ReplaceAll(
71 strings.Join([]string{cols[1], cols[5], cols[7]}, " "),
75 Mem = strings.ReplaceAll(strings.Join(cols[1:], " "), ",", "")
79 if cols[4] == "Used," {
88 func iostat(devs ...string) {
89 stats := make([]string, len(devs)*4)
90 for i := 0; i < len(devs); i++ {
94 stats = stats[:len(stats)-1]
95 for cols := range bg("iostat", append([]string{"-d", "-w", N, "-x"}, devs...)...) {
96 for i, dev := range devs {
98 stats[i*4+0] = cols[1]
99 stats[i*4+2] = cols[2]
100 IOs = strings.Join(stats, "")
107 stats := []string{"0", "0"}
108 for cols := range bg("netstat", "-n", N) {
109 if _, err := strconv.Atoi(cols[0]); err == nil {
112 Net = strings.Join(stats, "/")
118 ents, err := os.ReadDir("/tmp/stargrave-flags")
123 fs := make([]string, 0, len(ents))
124 for _, ent := range ents {
125 fs = append(fs, ent.Name())
127 Flags = strings.Join(fs, " ")
131 xsetroot := flag.Bool("xsetroot", false, "Call xsetroot")
132 iodevs := flag.String("iodevs", "ada0 ada1", "iostat devices")
133 refresh := flag.Uint("refresh", 2, "Refresh interval")
135 N = strconv.Itoa(int(*refresh))
139 time.Sleep(20 * time.Second)
143 go iostat(strings.Split(*iodevs, " ")...)
150 status = fmt.Sprintf(
151 "[IO %s] [Net %s] [CPU %s] [%sMem %s ARC %s] [%s] %s",
152 IOs, Net, CPU, Swap, Mem, ARC, Flags,
153 now.Format("2006-01-02 15:04:05"),
156 cmd = exec.Command("xsetroot", "-name", status)
161 time.Sleep(time.Duration(*refresh) * time.Second)