c.Wait() already waits for the command to exit, so the following should work:
err:=c.Wait()
if ctx.Err()!=nil {
// Context timeout
} else {
// Something else
}
On Wed, Aug 13, 2025 at 12:00 PM Peter Bočan <[email protected]> wrote:
>
> 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 [email protected].
> To view this discussion visit
> https://groups.google.com/d/msgid/golang-nuts/61e32341-38b4-4e9b-87d1-f093001440den%40googlegroups.com.
--
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 [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/golang-nuts/CAMV2RqpcLbK7LRysO5F%2BCHYLtR9PyEmyvj48k_c1nuCC11sBwg%40mail.gmail.com.