docstore/pkg/core/timeout.go
2019-04-28 18:16:40 +02:00

37 lines
559 B
Go

package core
import (
"errors"
"os/exec"
"time"
)
func Timeout(cmd *exec.Cmd, t time.Duration) (output []byte, err error) {
done := make(chan error)
out := make(chan []byte)
go func() {
o, e := cmd.Output()
done <- e
out <- o
}()
select {
case <-time.After(t):
e := cmd.Process.Kill()
<-out
if e != nil {
<-done
err = e
return
}
err = <-done
case e := <-done:
exerr, ok := e.(*exec.ExitError)
if ok {
err = errors.New(e.Error() + "\n" + string(exerr.Stderr))
} else {
err = e
}
output = <-out
}
return
}