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  }