X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/0fa7cd5bfdab924f316046f923aec282b699d8a1..b70c66d296babe5925e853ae2a5e6cfc2f250c0d:/sdk/go/crunchrunner/crunchrunner.go diff --git a/sdk/go/crunchrunner/crunchrunner.go b/sdk/go/crunchrunner/crunchrunner.go index 02f2be4c6f..8e24e18fda 100644 --- a/sdk/go/crunchrunner/crunchrunner.go +++ b/sdk/go/crunchrunner/crunchrunner.go @@ -124,9 +124,9 @@ func setupCommand(cmd *exec.Cmd, taskp TaskDef, outdir string, replacements map[ return stdin, stdout, nil } +// Set up signal handlers. Go sends signal notifications to a "signal +// channel". func setupSignals(cmd *exec.Cmd) chan os.Signal { - // Set up signal handlers - // Forward SIGINT, SIGTERM and SIGQUIT to inner process sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGTERM) signal.Notify(sigChan, syscall.SIGINT) @@ -234,24 +234,28 @@ func runner(api IArvadosClient, log.Printf("Running %v%v%v", cmd.Args, stdin, stdout) var caughtSignal os.Signal - { - sigChan := setupSignals(cmd) - defer signal.Stop(sigChan) + sigChan := setupSignals(cmd) - err = cmd.Start() - if err != nil { - return TempFail{err} + err = cmd.Start() + if err != nil { + signal.Stop(sigChan) + return TempFail{err} + } + + finishedSignalNotify := make(chan struct{}) + go func(sig <-chan os.Signal) { + for sig := range sig { + caughtSignal = sig + cmd.Process.Signal(caughtSignal) } + close(finishedSignalNotify) + }(sigChan) - go func(sig <-chan os.Signal) { - for sig := range sig { - caughtSignal = sig - cmd.Process.Signal(caughtSignal) - } - }(sigChan) + err = cmd.Wait() + signal.Stop(sigChan) - err = cmd.Wait() - } + close(sigChan) + <-finishedSignalNotify if caughtSignal != nil { log.Printf("Caught signal %v", caughtSignal)