projects
/
arvados.git
/ blobdiff
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch '5824-keep-web' into 5824-keep-web-workbench
[arvados.git]
/
sdk
/
go
/
crunchrunner
/
crunchrunner.go
diff --git
a/sdk/go/crunchrunner/crunchrunner.go
b/sdk/go/crunchrunner/crunchrunner.go
index 02f2be4c6f0d9ab84d238e180bd5e34d4cb1a3bc..8e24e18fda845866909aff7f6bba1bd02234d53c 100644
(file)
--- 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
}
return stdin, stdout, nil
}
+// Set up signal handlers. Go sends signal notifications to a "signal
+// channel".
func setupSignals(cmd *exec.Cmd) chan os.Signal {
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)
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
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)
if caughtSignal != nil {
log.Printf("Caught signal %v", caughtSignal)