// RunProc runs a process to completion, sending output to log func RunProc(cmd string, log termlog.Stream) error { log.Header() sh, error := getShell() if error != nil { return error } c := exec.Command(sh, "-c", cmd) stdo, err := c.StdoutPipe() if err != nil { return err } stde, err := c.StderrPipe() if err != nil { return err } buff := new(bytes.Buffer) mut := sync.Mutex{} err = c.Start() if err != nil { return err } wg := sync.WaitGroup{} wg.Add(2) go logOutput( &wg, stde, func(s string, args ...interface{}) { log.Warn(s) mut.Lock() defer mut.Unlock() buff.WriteString(s + "\n") }, ) go logOutput(&wg, stdo, log.Say) wg.Wait() err = c.Wait() if err != nil { log.Shout("%s", c.ProcessState.String()) return ProcError{err.Error(), buff.String()} } log.Notice(">> done (%s)", c.ProcessState.UserTime()) return nil }
// RunProc runs a process to completion, sending output to log func RunProc(cmd, shellMethod string, log termlog.Stream) error { log.Header() c, err := shell.Command(shellMethod, cmd) if err != nil { return err } stdo, err := c.StdoutPipe() if err != nil { return err } stde, err := c.StderrPipe() if err != nil { return err } buff := new(bytes.Buffer) mut := sync.Mutex{} err = c.Start() if err != nil { return err } wg := sync.WaitGroup{} wg.Add(2) go logOutput( &wg, stde, func(s string, args ...interface{}) { log.Warn(s, args...) mut.Lock() defer mut.Unlock() fmt.Fprintf(buff, "%s\n", args...) }, ) go logOutput(&wg, stdo, log.Say) wg.Wait() err = c.Wait() if err != nil { log.Shout("%s", c.ProcessState.String()) return ProcError{err.Error(), buff.String()} } log.Notice(">> done (%s)", c.ProcessState.UserTime()) return nil }