X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/5d3de212473f9fbf0e797c1fc03ec1dbf8f532ef..c1d63408c611a5ce65dc4de41aeb323c06da2bbc:/sdk/go/crunchrunner/crunchrunner.go diff --git a/sdk/go/crunchrunner/crunchrunner.go b/sdk/go/crunchrunner/crunchrunner.go index ea29be8ba0..8e24e18fda 100644 --- a/sdk/go/crunchrunner/crunchrunner.go +++ b/sdk/go/crunchrunner/crunchrunner.go @@ -124,14 +124,10 @@ 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) - go func(sig <-chan os.Signal) { - catch := <-sig - cmd.Process.Signal(catch) - }(sigChan) signal.Notify(sigChan, syscall.SIGTERM) signal.Notify(sigChan, syscall.SIGINT) signal.Notify(sigChan, syscall.SIGQUIT) @@ -237,11 +233,34 @@ func runner(api IArvadosClient, } log.Printf("Running %v%v%v", cmd.Args, stdin, stdout) + var caughtSignal os.Signal + sigChan := setupSignals(cmd) + 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) - signals := setupSignals(cmd) err = cmd.Wait() - signal.Stop(signals) + signal.Stop(sigChan) + + close(sigChan) + <-finishedSignalNotify + + if caughtSignal != nil { + log.Printf("Caught signal %v", caughtSignal) + return PermFail{} + } if err != nil { // Run() returns ExitError on non-zero exit code, but we handle @@ -321,6 +340,7 @@ func main() { log.Fatal(err) } + syscall.Umask(0022) err = runner(api, kc, jobUuid, taskUuid, tmpdir, keepmount, jobStruct, taskStruct) if err == nil {