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  }