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.

Reply via email to