My function
func RunCommand(cmdPath string, cmdArgs string) (error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
cmd := exec.CommandContext(ctx, cmdPath, cmdArgs)
stdout, err := cmd.StdoutPipe()
if err != nil {
return err
}
defer stdout.Close()
scanner := bufio.NewScanner(stdout)
err := cmd.Start()
if err != nil {
return err
}
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for scanner.Scan() {
doSomething(scanner.Text())
}
if scanner.Err() != nil {
log.Errf("Error reading stdout, %v", scanner.Err())
}
}()
done := make(chan error, 1)
go func() {
done <- cmd.Wait()
}()
select {
case <-ctx.Done():
return ctx.Err()
case err := <-done:
if err != nil {
return err
}
}
wg.Wait()
return nil
}
I am only able to reproduce this issue a few times where i get this error: Error reading stdout, read |0: file already closed. My understanding is i am closing stdout prior to checking scanner.Err() but why is that happening. I am using cmd.Wait() in a go routine which should wait for scanner.Err() and then close stdout right?