我试图阻止以exec.Command("go", "run", "server.go")
及其所有子进程开始的进程。
但是当我调用cmd.Process.Kill()
并且go
进程停止时,子进程(server.go
中的Web服务器)继续运行。
package main
import (
"fmt"
"os/exec"
"time"
)
func run() *exec.Cmd {
cmd := exec.Command("go", "run", "server.go")
err := cmd.Start()
if err != nil {
panic(err)
}
return cmd
}
func main() {
cmd := run()
time.Sleep(time.Second * 2)
err := cmd.Process.Kill()
if err != nil {
panic(err)
}
cmd.Process.Wait()
// === Web server is still running! ===
fmt.Scanln()
}
看起来Process.Kill()
只会停止go (run)
进程,但会使其子进程(Web服务器)继续运行。
^C
杀死整个进程组,包括所有子进程(和子子进程)。我怎么能这样做?
我尝试了cmd.Process.Signal(os.Interrupt)
,syscall.SIGINT
,syscall.SIGQUIT
和syscall.SIGKILL
,但没有做过任何事情。
答案 0 :(得分:6)
不要使用go run
命令。使用the go install
命令安装程序包和程序,然后执行程序。