One might argue that Run should respect the context deadline even in the presence of pipes that don't EOF.
On 29 Sep 2017 22:26, "Ian Lance Taylor" <i...@golang.org> wrote: > On Fri, Sep 29, 2017 at 12:33 PM, Alex Buchanan <buchanae.o...@gmail.com> > wrote: > > > > package main > > > > import ( > > "bytes" > > "context" > > "log" > > "os/exec" > > "time" > > ) > > > > func main() { > > var stdout bytes.Buffer > > > > ctx, cancel := context.WithTimeout(context.Background(), time.Second) > > defer cancel() > > > > cmd := exec.CommandContext(ctx, "/bin/sh", "-c", "sleep 10; echo foo") > > cmd.Stdout = &stdout > > > > err := cmd.Run() > > log.Printf("%s, %s, '%s'", err, ctx.Err(), stdout.String()) > > } > > > > > > This runs for 10 seconds, but I was expecting 1 second. Can someone help > me > > understand what is happening? I think it has something to do with the > stdout > > bytes.Buffer? > > Yes. The problem is that when the context passed to CommandContext > expires, it kills the process started by the command, but does not > kill any subprocesses that that command may have started. So when the > context expires the /bin/sh is killed, but the sleep subprocess is > still running. Because you use a bytes.Buffer, the program has > created a pipe to capture the standard output of the command. After > the process dies, cmd.Run is waiting for that pipe to be closed to > make sure that it gathers all the data. But the pipe is held open by > the sleep subprocess. It is only after that subprocess exits that the > pipe is closed and your program continues. > > Ian > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.