github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/drivers/shared/executor/executor_unix.go (about) 1 // +build darwin dragonfly freebsd linux netbsd openbsd solaris 2 3 package executor 4 5 import ( 6 "fmt" 7 "os" 8 "syscall" 9 ) 10 11 // configure new process group for child process 12 func (e *UniversalExecutor) setNewProcessGroup() error { 13 if e.childCmd.SysProcAttr == nil { 14 e.childCmd.SysProcAttr = &syscall.SysProcAttr{} 15 } 16 e.childCmd.SysProcAttr.Setpgid = true 17 return nil 18 } 19 20 // Cleanup any still hanging user processes 21 func (e *UniversalExecutor) cleanupChildProcesses(proc *os.Process) error { 22 // If new process group was created upon command execution 23 // we can kill the whole process group now to cleanup any leftovers. 24 if e.childCmd.SysProcAttr != nil && e.childCmd.SysProcAttr.Setpgid { 25 if err := syscall.Kill(-proc.Pid, syscall.SIGKILL); err != nil && err.Error() != noSuchProcessErr { 26 return err 27 } 28 return nil 29 } 30 return proc.Kill() 31 } 32 33 // Only send the process a shutdown signal (default INT), doesn't 34 // necessarily kill it. 35 func (e *UniversalExecutor) shutdownProcess(sig os.Signal, proc *os.Process) error { 36 if sig == nil { 37 sig = os.Interrupt 38 } 39 40 if err := proc.Signal(sig); err != nil && err.Error() != finishedErr { 41 return fmt.Errorf("executor shutdown error: %v", err) 42 } 43 44 return nil 45 }