package main import ( "log" "os" "os/exec" "strings" "sync" "time" ) const ( step int64 = 100 spacer string = " " ) var ( stop bool = false statusList []string ) func statusRoutine(script Script, statusListIndex int, wg *sync.WaitGroup) { defer wg.Done() for !stop { cmd := exec.Command(script.Filepath, script.Args...) stdout, err := cmd.Output() if err != nil { log.Println(err) } else { statusList[statusListIndex] = strings.Trim(string(stdout), "\n") } time.Sleep(time.Duration(script.Frequency) * time.Millisecond) } } func statusCache(wg *sync.WaitGroup) { defer wg.Done() for !stop { output := "" for _, status := range statusList { output += status + spacer } // log.Println(output) err := os.WriteFile("/home/xoy/.cache/statman.out", []byte(output), 0666) if err != nil { log.Fatal(err) } time.Sleep(10 * time.Millisecond) } } func main() { var wg sync.WaitGroup err, config := LoadConfig() if err != nil { log.Fatal(err) } statusList = make([]string, len(config.Scripts)) wg.Add(len(config.Scripts) + 1) for i, script := range config.Scripts { go statusRoutine(script, i, &wg) } go statusCache(&wg) wg.Wait() }