比如代码这样的
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 开启的所有子进程都被关闭(哪怕强制退出)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.