Hello all, I am running into a little nifty problem. I have a program which can run an arbitrary command, and in a separate goroutine it awaits the termination of the subprocess. This works nicely, but not as nicely as I would want to. If my program terminates, the Wait() will error out with "signal: killed", which is fine, if it's intended to be terminated alongside with my program. However, if that's not the case and the subprocess is terminated for other reasons, the observing the channel as outlined below blocks the goroutine indefinitely, which is not something I want. c := exec.CommandContext(ctx, ...) c.Start() go func() { log.Debug().Msg("waiting for a program...") err := c.Wait() select { case <- ctx.Done(): // it's ever done, if the process terminates early } if err != nil { // Prints out that the program received the signal, which is not something I want to do. log.Fatal().Err(err).Msg("failed to run the program") } }()
I could get around it other ways (using WaitGroup), but do you think there is a slightly nicer way, if we could include a method on the Context interface called "Cancelled() bool" which would simply return a boolean value if the context was somewhere somehow cancelled? Or maybe it should be done on the exec.Cmd object itself? c := exec.CommandContext(ctx, ...) c.Start() go func() { log.Debug().Msg("waiting for a program...") // no more Wait() necessary. select { case <- c.Done(): // done, if the process terminates early case <- c.Cancelled() // done, if the execution context has been cancelled } }() Just a food for thought, Peter Bocan. -- 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. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/61e32341-38b4-4e9b-87d1-f093001440den%40googlegroups.com.