diff --git a/commands/local_proxy_start.go b/commands/local_proxy_start.go index 50182da9..b6ccfffa 100644 --- a/commands/local_proxy_start.go +++ b/commands/local_proxy_start.go @@ -167,7 +167,7 @@ var localProxyStartCmd = &console.Command{ shutdownCh := make(chan bool, 1) go func() { sigsCh := make(chan os.Signal, 1) - signal.Notify(sigsCh, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) + signal.Notify(sigsCh, os.Interrupt, syscall.SIGQUIT, syscall.SIGTERM) <-sigsCh signal.Stop(sigsCh) shutdownCh <- true diff --git a/commands/local_server_start.go b/commands/local_server_start.go index 222e7a1f..73c65257 100644 --- a/commands/local_server_start.go +++ b/commands/local_server_start.go @@ -89,7 +89,7 @@ var localServerStartCmd = &console.Command{ shutdownCh := make(chan bool, 1) go func() { sigsCh := make(chan os.Signal, 1) - signal.Notify(sigsCh, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) + signal.Notify(sigsCh, os.Interrupt, syscall.SIGQUIT, syscall.SIGTERM) <-sigsCh signal.Stop(sigsCh) shutdownCh <- true diff --git a/local/process/process.go b/local/process/process.go index 6f1faac3..ffc2d112 100644 --- a/local/process/process.go +++ b/local/process/process.go @@ -24,7 +24,6 @@ import ( "context" "os" "os/exec" - "syscall" "github.com/pkg/errors" "github.com/rs/zerolog" @@ -72,8 +71,7 @@ func (p *Process) Run(ctx context.Context) (*exec.Cmd, error) { cmd.Env = os.Environ() cmd.Env = append(cmd.Env, p.Env...) - cmd.SysProcAttr = &syscall.SysProcAttr{} - deathsig(cmd.SysProcAttr) + cmd.SysProcAttr = createSysProcAttr() if err := cmd.Start(); err != nil { return nil, errors.WithStack(err) } diff --git a/local/process/process_linux.go b/local/process/process_linux.go index 4437de40..3d9c3564 100644 --- a/local/process/process_linux.go +++ b/local/process/process_linux.go @@ -22,15 +22,19 @@ package process import ( "os/exec" "syscall" + + "golang.org/x/sys/unix" ) -func deathsig(sysProcAttr *syscall.SysProcAttr) { - // the following helps with killing the main process and its children - // see https://medium.com/@felixge/killing-a-child-process-and-all-of-its-children-in-go-54079af94773 - sysProcAttr.Setpgid = true - sysProcAttr.Pdeathsig = syscall.SIGKILL +func createSysProcAttr() *syscall.SysProcAttr { + return &unix.SysProcAttr{ + // the following helps with killing the main process and its children + // see https://medium.com/@felixge/killing-a-child-process-and-all-of-its-children-in-go-54079af94773 + Setpgid: true, + Pdeathsig: unix.SIGKILL, + } } func kill(cmd *exec.Cmd) error { - return syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + return unix.Kill(-cmd.Process.Pid, unix.SIGKILL) } diff --git a/local/process/process_other.go b/local/process/process_other.go index 953ef82e..dc195f18 100644 --- a/local/process/process_other.go +++ b/local/process/process_other.go @@ -23,16 +23,19 @@ package process import ( + "os" "os/exec" "syscall" ) -func deathsig(sysProcAttr *syscall.SysProcAttr) { - // the following helps with killing the main process and its children - // see https://medium.com/@felixge/killing-a-child-process-and-all-of-its-children-in-go-54079af94773 - sysProcAttr.Setpgid = true +func createSysProcAttr() *syscall.SysProcAttr { + return &syscall.SysProcAttr{ + // the following helps with killing the main process and its children + // see https://medium.com/@felixge/killing-a-child-process-and-all-of-its-children-in-go-54079af94773 + Setpgid: true, + } } func kill(cmd *exec.Cmd) error { - return syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + return syscall.Kill(-cmd.Process.Pid, os.SIGKILL) } diff --git a/local/process/process_windows.go b/local/process/process_windows.go index e062c1ca..9312bf9f 100644 --- a/local/process/process_windows.go +++ b/local/process/process_windows.go @@ -20,12 +20,16 @@ package process import ( + "os" "os/exec" "strconv" "syscall" + + "golang.org/x/sys/windows" ) -func deathsig(sysProcAttr *syscall.SysProcAttr) { +func createSysProcAttr() *syscall.SysProcAttr { + return &windows.SysProcAttr{} } func kill(cmd *exec.Cmd) error { @@ -33,5 +37,5 @@ func kill(cmd *exec.Cmd) error { if err := c.Run(); err == nil { return nil } - return cmd.Process.Signal(syscall.SIGKILL) + return cmd.Process.Signal(windows.SIGKILL) } diff --git a/local/runner.go b/local/runner.go index b128c91d..fd5b9c6a 100644 --- a/local/runner.go +++ b/local/runner.go @@ -107,7 +107,7 @@ func (r *Runner) Run() error { cmdExitChan := make(chan error) // receives command exit status, allow to cmd.Wait() in non-blocking way restartChan := make(chan bool) // receives requests to restart the command sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, os.Kill, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + signal.Notify(sigChan, os.Kill, os.Interrupt, syscall.SIGTERM) defer signal.Stop(sigChan) if len(r.pidFile.Watched) > 0 {