package main import ( "fmt" "os/exec" "log" "io" "os" "errors" "sync" "lcthw.dev/learn-code-the-hard-way/ozai/config" ) func LaunchLogger(in io.Reader, out io.Writer, err error) { if err != nil { log.Fatal(err) } go func() { if _, err := io.Copy(out, in); err != nil { log.Fatal(err) } }() } func main() { config.Load() fmt.Println("CONFIG:", config.Settings.ConfigPath) fmt.Println("COMMANDs:", config.Settings.Processes) var wg sync.WaitGroup for name, proc := range config.Settings.Processes { fmt.Println("PROCESS:", name) wg.Add(1) go func() { defer wg.Done() for { fmt.Println("STARTING", name) cmd := exec.Command(proc.Command, proc.Args...) if errors.Is(cmd.Err, exec.ErrDot) { cmd.Err = nil } stderr, err := cmd.StderrPipe(); LaunchLogger(stderr, os.Stdout, err) stdout, err := cmd.StdoutPipe(); LaunchLogger(stdout, os.Stdout, err) cmd.Run() fmt.Println("WAITING for", name) cmd.Wait() fmt.Println("PROC", name, "EXITED SEND QUIT") } }() } wg.Wait() }