60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
//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()
|
|
}
|