子进程的Process.Kill()

ber*_*rdw 4 go

我正在尝试停止启动进程exec.Command("go", "run", "server.go")及其所有子进程.

但是当我调用cmd.Process.Kill()并且go进程停止时,子进程(Web服务器server.go)继续运行.

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()
}
Run Code Online (Sandbox Code Playgroud)

它看起来Process.Kill()只会停止go (run)进程,但会使其子进程(Web服务器)运行.

^C杀死整个过程组,包括所有子(和子子)过程.我怎么能这样做?

我试过cmd.Process.Signal(os.Interrupt),syscall.SIGINT,syscall.SIGQUITsyscall.SIGKILL,其中没有一个做了什么.

pet*_*rSO 6

不要使用该go run命令.使用the go install命令安装程序包和程序,然后执行程序.

  • 大约,`go run` 在内部做了`go build -o prog` 和`./prog`,所以当你杀死`go run` 进程时,你不会杀死它的子进程`./prog`。 (2认同)