github.com/anuvu/nomad@v0.8.7-atom1/client/driver/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.cmd.SysProcAttr == nil { 14 e.cmd.SysProcAttr = &syscall.SysProcAttr{} 15 } 16 e.cmd.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.cmd.SysProcAttr != nil && e.cmd.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(proc *os.Process) error { 36 // Set default kill signal, as some drivers don't support configurable 37 // signals (such as rkt) 38 var osSignal os.Signal 39 if e.command.TaskKillSignal != nil { 40 osSignal = e.command.TaskKillSignal 41 } else { 42 osSignal = os.Interrupt 43 } 44 45 if err := proc.Signal(osSignal); err != nil && err.Error() != finishedErr { 46 return fmt.Errorf("executor.shutdown error: %v", err) 47 } 48 49 return nil 50 }