//go:build !windows package runtime import ( "os" "os/exec" ) type execManagedProcess struct { cmd *exec.Cmd } func startManagedProcess(command ProcessCommand, files managedProcessFiles, _ string) (managedProcess, error) { cmd := exec.Command(command.Args[0], command.Args[1:]...) cmd.Dir = command.WorkDir cmd.Env = os.Environ() for key, value := range command.Env { cmd.Env = append(cmd.Env, key+"="+value) } cmd.Stdout = files.stdout cmd.Stderr = files.stderr if err := cmd.Start(); err != nil { return nil, err } return &execManagedProcess{cmd: cmd}, nil } func requestManagedProcessStop(identity ProcessIdentity) error { process, err := os.FindProcess(identity.PID) if err != nil { return err } return process.Kill() } func forceManagedProcessStop(identity ProcessIdentity) error { return requestManagedProcessStop(identity) } func (process *execManagedProcess) PID() int { return process.cmd.Process.Pid } func (process *execManagedProcess) TargetPID() int { return process.PID() } func (process *execManagedProcess) Wait() (int, error) { err := process.cmd.Wait() if process.cmd.ProcessState == nil { return -1, err } return process.cmd.ProcessState.ExitCode(), err } func (process *execManagedProcess) Kill() error { return process.cmd.Process.Kill() }