比如代码这样的
func command(command string, writer io.Writer, notify chan struct{}) {
r, w := io.Pipe()
cmd := exec.Command("bash")
cmd.Dir = "/data"
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} # 这个还不兼容 windows
cmd.Stdin = r
stdout, _ := cmd.StdoutPipe()
stderr, _ := cmd.StderrPipe()
defer stdout.Close()
defer stderr.Close()
cmd.Start()
go trans(stdout, writer) // iocopy
go trans(stderr, writer)
go func() {
<-notify
fmt.Println(cmd.Process.Kill())
w.Close()
}()
fmt.Fprint(w, command)
w.Close()
cmd.Wait()
}
如果执行 yarn build 会执行一个 nodejs 的构建,但是当 notify 通知后,bash 进程退出了。nodejs 进程僵尸了。
怎么保证所有由 bash 开启的所有子进程都被关闭(哪怕强制退出)